Introduction
This report is an overview of the initial observations and analysis
performed on the Food Security Cluster 5Ws data for the first
three-quarters of 2021; the issues identified and analysis have been
broken into large groups corresponding with the first 4 chapters –
geographical coverage, activities and modalities, partners and
beneficiaries. This report ends with a brief section on next steps and
an interactive reference table and reference map.
We have endeavoured to provide actionable information and believe
that releasing this report is a necessary part of jumpstarting the
process of resolving the more pressing concerns identified. Further
analysis is merited in several areas; and this will be undertaken once
consultations with partners have been completed.
Unless otherwise specified, beneficiary figures in this report are
the number of unique beneficiaries, as opposed to beneficiary
frequencies.
1. Geographical coverage
1.1 Comparing beneficiaries reached and 2021 PIN by state and
region
A total of 2,088,142 unique beneficiaries have been reached across
the country; this is 75.43% of the targetted 2,768,349 persons; however,
not all the beneficiaries reached corresponded to areas where there were
targets – this is explored in more detail in the section on
townships.

1.2 Table of beneficiaries and PIN by state and region
Beneficiaries reached and PIN by state/region
|
state
|
beneficiaries
|
%_of_ben
|
target
|
%_of_target
|
%_target_reached
|
PIN
|
|
Yangon
|
1,274,906
|
61.27
|
1,777,522
|
64.21
|
71.72
|
1,777,522
|
|
Rakhine
|
430,247
|
20.68
|
487,182
|
17.60
|
88.31
|
632,805
|
|
Kachin
|
87,452
|
4.20
|
86,117
|
3.11
|
101.55
|
102,649
|
|
Shan (North)
|
64,794
|
3.11
|
13,428
|
0.49
|
482.53
|
24,657
|
|
Ayeyarwady
|
55,276
|
2.66
|
0
|
0.00
|
NA
|
0
|
|
Kayin
|
46,932
|
2.26
|
6,855
|
0.25
|
684.64
|
6,855
|
|
Mon
|
43,442
|
2.09
|
0
|
0.00
|
NA
|
0
|
|
Mandalay
|
24,829
|
1.19
|
381,818
|
13.79
|
6.50
|
381,818
|
|
Kayah
|
15,920
|
0.77
|
5,830
|
0.21
|
273.07
|
5,830
|
|
Chin
|
13,550
|
0.65
|
5,106
|
0.18
|
265.37
|
13,275
|
|
Shan (South)
|
9,304
|
0.45
|
1,978
|
0.07
|
470.37
|
2,054
|
|
Sagaing
|
8,090
|
0.39
|
0
|
0.00
|
NA
|
0
|
|
Bago (East)
|
4,312
|
0.21
|
2,513
|
0.09
|
171.59
|
2,513
|
|
Magway
|
1,695
|
0.08
|
0
|
0.00
|
NA
|
0
|
Yangon and Rakhine form both 82% of the target and 82% of the
beneficiaries reached. Mandalay has has the largest difference between
targets and beneficiaries reached. There were four states (Ayeyarwady,
Mon, Sagaing and Magway) where beneficiaries were reached but were not
included as part of the 2021 target or PIN; however, the beneficiaries
reached in these areas represent less than 5% of all beneficiaries
reached. Additionally, targets have been exceeded in 7 states, with
Kayin having reached 684% of its target of 6,855 persons.
However, moving forward, the PIN for 2022 is much more evenly spread
across the country: with reference to the plot below, Yangon, along with
Magway and Mandalay have some of the lowest proportions of vulnerable
persons in relation to the total state population, meaning that careful
beneficiary selection and tight vulnerability in these areas will
necessary to avoid excessive inclusion errors.

1.3 Township-level distribution of beneficiaries
Just as the response is heavily weighted towards Yangon and Rakhine
at the state and region level, the same is true at the township level as
well. These 10 townships below are where 80% of beneficiaries have been
reached collectively, they represent 53% of the 2021 target. In
particular, Hlaingtharya has beneficiary figures that are 378% of its
target. Additionally, neither Kawareik in Kayin or Kyaikmaraw in Mon
were targetted as part of the 2021 PIN despite being in the top 10
townships by beneficiaries reached – only 88.5% of beneficiaries
corresponded to townships with targets.
Top 10 townships by beneficiaries reached in 2021
| Hlaingtharya |
Yangon |
772,658 |
37 |
204,542 |
11.29 |
377.8 |
| Dagon Myothit (Seikkan) |
Yangon |
276,430 |
13.24 |
199,242 |
11 |
138.7 |
| Dala |
Yangon |
170,463 |
8.16 |
200,589 |
11.07 |
84.98 |
| Sittwe |
Rakhine |
147,864 |
7.08 |
127,750 |
7.05 |
115.8 |
| Buthidaung |
Rakhine |
106,815 |
5.12 |
121,631 |
6.71 |
87.82 |
| Maungdaw |
Rakhine |
80,348 |
3.85 |
71,360 |
3.94 |
112.6 |
| Pauktaw |
Rakhine |
33,907 |
1.62 |
28,162 |
1.55 |
120.4 |
| Kawkareik |
Kayin |
30,867 |
1.48 |
0 |
0 |
NA |
| Lashio |
Shan (North) |
29,963 |
1.43 |
5.7 |
0 |
525,667 |
| Kyaikmaraw |
Mon |
28,590 |
1.37 |
0 |
0 |
NA |
107 townships have been reached by food security activities in the
first three-quarters of 2021. This is less than a third of the 330
townships in the country. It is also important to note that three
townships – Hpapun in Kayin, Muse in Shan (North) and Kyethi in Shan
(South) have been targetted since the initial 2021 HRP, yet have not
been reached by any FSC activities; 10 townships, overall, in either the
HRP or IERP, have not benefitted from any FSC activities.
Overall, 66.73% of the targetted population was reached. From the
histogram below, we can see that overreach and under-reaching are very
common at the township level – townships are commonly clustered at
around 0% reached and also at 200% reached or more. Of the 51 townships
targetted in 2021; 21 townships reached more than 120% of their target,
4 reached between 100% and 119% of their target; 7 townships reached
between 80% and 100% of their target; and 2 townships reached less than
80% of their target.

1.4 Locations
Partners have responded in a total of 1563 locations across the
country, with the vast majority of locations only having only one
partner operating in them; the maximum number of partners in any
location is 3. Of the 5776 rows reported in the 5Ws, only 156 did not
report a specific location.
Locations are classified into three groups – camps, industrial zones
and villages/towns/wards:
Summary of location types
| village_ward_town |
1,157 |
90 |
1,422,282 |
81.42 |
1,229 |
| camp |
421 |
38 |
316,648 |
18.13 |
752 |
| industrial_zone |
5 |
2 |
7,870 |
0.45 |
1,574 |
The vast majority of locations are served by only one partner. Below
are a series of histograms showing the variation in the number of
beneficiaries by location, split by number of partners in each
location:

The more partners operating in a given location, the higher the
average number of beneficiaries; however, it should be noted that these
multi-partner locations are comparatively rare:
| one_partner |
1,496 |
182 |
| two_partners |
61 |
676 |
| three_partners |
11 |
859 |
2. Activities and modalities
2.1 Progress by activity

Partners reported their achievements across the eight 5W activities.
As note, we see that the majority of the caseload for monthly cash-based
transfers was established prior to 2021 (with the number of
beneficiaries only increasing very incrementally across the couese of
the year) – this aligns with our understanding that many of the projects
contributing to this activity were multi-year in nature and had been
ongoing prior to the HRP.
One of the difficulties of interpreting these data is that it is not
always apparent where the patterns observed are reflective or changes in
the field (such as changes in access, funding or staffing) or if they
are instead due to partners’ reporting behaviours. We note, for
instance, a large jump in the number of beneficiaries for fishery its
and food baskets around July 2021 – this was due to the newly-approved
addendum to the HRP. However, some of the other changes are less clear
and will require careful exploration with partners.
2.2 Delivery modalilties
Cash was the main delivery modality in four out of the eight
activities under the Food Security Cluster, followed by “in-kind”, which
was predominantly employed in three. However, the in-kind modality has
the highest reach, given the especially large beneficiary numbers
originating from the provision of monthly food baskets. We also note
several misclassifications – small portions of monthly cash transfers
have been coded as in-kind and there are in-kind food baskets coded as
hybrid. It might also be worth more clearly delineating between “support
for income-generating activities” and the “provision of technical
training” as service delivery and support are heavily present in
both.

63% of beneficiary frequencies received support through the in-kind
delivery modality; we use beneficiary frequencies here as there were
several instances of modalities changing partway through an
intervention: for reference, 85% of beneficiaries were reached initially
with in-kind interventions, meaning that there was a tendency to
diversify away from in-kind support over 2021. 33% of beneficiary
frequencies were reached by cash transfers.
Beneficiary frequencies by delivery modalities and frequency of
distribution
| In-kind |
303,595 |
1,222,709 |
407,196 |
1,417,351 |
110,723 |
3,461,574 |
63 |
| Cash |
894 |
1,572,070 |
103,357 |
4,746 |
117,525 |
1,798,592 |
32.74 |
| Hybrid (In-kind & Cash) |
NA |
183,097 |
2,488 |
10,810 |
NA |
196,395 |
3.57 |
| Voucher |
NA |
NA |
2,652 |
16,519 |
NA |
19,171 |
0.35 |
| Service delivery/support |
NA |
4,383 |
9,060 |
4,690 |
NA |
18,133 |
0.33 |
| NA |
NA |
NA |
NA |
423 |
NA |
423 |
0.01 |
| Total |
304,489 |
2,982,259 |
524,753 |
1,454,539 |
228,248 |
5,494,288 |
100 |
Regarding the table above, there is a strong argument to remove the
option “other” from the 5W column frequency (referring to
frequency of transfer/delivery) – what exactly it connotes is unclear,
as partners might elect this option for activities that occur both more
and less frequently than every month; there is also the possibility that
partners are just electing “other” instead of leaving the column blank.
It is possible to backfill some of the “other” values from the
beneficiary_recurrency column. This will be explored
further in the chapter on beneficiaries.
A key piece of missing information not currently captured by the 5W
template is the duration of these activities – the number of months a
monthly food basket is provided can only be calculated somewhat reliably
with considerable effort. The table below shows the average duration (in
months) of the various activities in the frequency category
“Monthly”:
Average duration (in months) of monthly activities
| Provide monthly cash-based transfers |
6.205 |
| Provide monthly food baskets |
4.688 |
| Provide technical training |
2.18 |
| Cash for Work / Food for Assets |
1.838 |
| Provide support for income generation |
1 |
2.3 Monetary values of intervention packages per household

The most common transfer values – in terms of beneficiaries reached –
are between USD 10 and USD 20, though it should be noted – and can be
more clearly seen from the table below, a not insignificant number of
beneficiaries (about 8%) were reached by cash transfer interventions
valued at more than USD 100 per household. Please note that these
monetary values were calculated only from rows with unique beneficiaries
and that we are not using the cumulative sums per household.
Cash transfer, hybrid and voucher values per household by
frequency of transfer (USD)
| <$10 |
185 |
30,682 |
2,126 |
9,543 |
42,536 |
14.82 |
| >=$10_<$20 |
241 |
122,979 |
8,002 |
502 |
131,724 |
45.9 |
| >=$20_<$40 |
242 |
11,335 |
13,756 |
1,881 |
27,214 |
9.48 |
| >=$40_<$60 |
226 |
29,536 |
12,850 |
188 |
42,800 |
14.91 |
| >=$60_<$100 |
NA |
9,826 |
4,850 |
4,912 |
19,588 |
6.83 |
| >=$100_<$200 |
NA |
413 |
14,255 |
789 |
15,457 |
5.39 |
| >=$200 |
NA |
23 |
7,204 |
438 |
7,665 |
2.67 |
Next, let us take a look at household package values by activity
type:

Overall, the highest average cash transfers were from activities
providing support for income generation and the lowest averages coming
from monthly cash-based transfers (after discounting food baskets, where
less than 1% of activities reported the package value).
It would be fruitful to explore the provision of monthly cash-based
transfers in more detail – this activity has a very clear peak at
>=$10_<$20. A closer look reveals that this is almost
entirely due to the 122,854 beneficiaries who received monthly transfers
of USD 10.50/month (or MMK 15,000) per household. It is unclear whether
this is a data entry error – but what we do know is that the households
that received this type of transfer were not abnormally small; it might
be possible that be possible that this activity had been conceived as
one singular transfer that had been split across several months.
This should be followed up with the 7 partners who provided this
transfer value to beneficiary households; they are: Save the Children,
WFP, Myanmar Heart Organisation, People for People, Plan International,
World Vision Myanmar and Karuna Mission Social Solidarity.
If correct, this amount falls far below the minimum expenditure
basket for food identified by the Cash Working Group, which established
a floor of MMK 190,555 per household per month. Below is a table which
summarises the percentage of the minimum expenditure basket is covered
by the different bins we have established for the cash-transfer
values:
Monthly cash-based transfer by percentage of MEB
received
| <$10 |
4.21 |
5.61 |
32,746 |
14.82 |
| >=$10_<$20 |
7.92 |
10.57 |
122,582 |
55.47 |
| >=$20_<$40 |
25.17 |
33.57 |
16,431 |
7.43 |
| >=$40_<$60 |
34.06 |
45.43 |
28,927 |
13.09 |
| >=$60_<$100 |
53.66 |
71.58 |
15,836 |
7.17 |
| >=$100_<$200 |
79.86 |
106.5 |
4,463 |
2.02 |
| >=$200 |
199.2 |
265.6 |
22 |
0.01 |
Around 9% of beneficiaries of monthly cash-based transfers have
received more than 50% of the value of the minimum expenditure basket
for food. Notably, 15% of beneficiaries have received less than USD 10
per household per month. This underscores the importance of
standardisation: beneficiaries have already received very different
package amounts and there is a pressing need to collect information on
whether cash transfers (and food baskets) have been designed to be full
rations or are instead intended to be supplementary activities. This is
key from a coordination standpoint as we cannot consider the food
security needs of those who have only received supplementary transfers
to have been covered.
3. Partners
Of the 51 partners of the Food Security Cluster, a total of 49 of
them classified themselves as implementing partners within the 5Ws. They
are fairly evenly split themselves between HRP indicators, with 32
contributing towards food and cash assistance and 29 contributing
towards agriculture and other livelihood support. 28 partners have
reached less than 10,000 unique beneficiaries and the median unique
beneficiaries reached by partners is 4,697. Below are the top 10
partners by HRP indicator. As a side note, Zigway should be considered
as a vendor/supplier of WFP, and not the implementing partner – some
follow up with WFP will be necessary to rectify this.
Top 10 partners by beneficiaries reached, by HRP
indicator
| Open Data Myanmar (ODM) |
304,919 |
|
Center for Social Integrity (CSI) |
28,725 |
| MRCS |
263,005 |
|
Action Contre la Faim |
19,109 |
| Zigway |
223,478 |
|
Action for Green Earth |
16,037 |
| Hlaingthayar Development Network |
189,701 |
|
World Vision Myanmar |
15,303 |
| World Vision Myanmar |
168,698 |
|
Myanmar Heart Development Organization |
9,867 |
| Urban Strength (US) |
128,878 |
|
WFP |
7,691 |
| WFP |
105,984 |
|
Save the Children |
7,543 |
| Hlaingthayar Youth Network |
96,145 |
|
Phyu Sin Saydanar Action Group |
6,052 |
| Action for Green Earth |
67,578 |
|
BRAC Myanmar |
5,162 |
| Myanmar Heart Development Organization |
63,838 |
|
MRCS |
5,051 |
3.1 Distribution of partners by beneficiaries and geographic
reach
Whilst there is quite a bit of variation in the number of
beneficiaries reached, we can see that partners’ geographic footprints
are – on the whole – quite limited. Only 4 partners have a presence in
more than 10 townships, with only 10 being present in more than 5
townships. 79% of our partners (clustered along the bottom of the chart)
are present in 5 or less townships. This distribution of partners is an
impediment to a countrywide response and it is imperative to understand
how best to incentivise partners to expand their footprints.
3.2 Maps of number of partners and 2022 people in need by
state/region
Food Security Cluster partners are not well-positioned to meet the
needs of the 2022 population in need. Partners are largely concentrated
in Kachin, Rakhine and Yangon, with no partners present in Tanintharyi
and Bago (West) and only one partner present in Magway, Bago (East) and
Shan (East). The number of partners in Ayeryawady is also quite
disproportionate with the number of people in need in that region.
Overall, 71% of townships, containing 62% of the 2022 PIN, do not
have any partners present. This lack of nationwide coverage will be one
of the most important constraints that the FSC will face in meeting the
2022 needs of vulnerable, food insecure persons and IDPs – and resolving
this will necessitate increasing partner coverage and finding new
partners the cluster.

3.3 Reporting organisations
There are 58 combinations between reporting organisations and
implementing partners, 19 of which are instances where the reporting
organisation and the implementing partner are the same organisation;
once these are filtered out, all the remaining implementing partners
correspond to just 10 reporting organisations:
Number of implementing partners by reporting
organisation
| WFP |
21 |
| Save the Children |
4 |
| FAO |
3 |
| Finn Church Aid |
3 |
| Mercy Corps |
2 |
| Trocaire |
2 |
| AVSI |
1 |
| Danish Refugee Council |
1 |
| Helvetas |
1 |
| Oxfam |
1 |
Regarding questions of membership, it would be safe to say that all
partners who reported in the 5Ws – be they reporting organisations or
implementing partners – in addition to strategic partners and partners
who aid in analysis who are not represented in the 5Ws, are FSC
partners. However, for this report, we have used
implementing_partners for most of the analysis as, by their
nature, reporting organisations do not have a field presence. As a side
note, FAO has not classified itself as an implementing partner, having
reported no activities that were directly implemented by them.
3.4 Types of partners
Average reach by implementing partner type
| INGO |
86,455 |
4.882 |
1.941 |
| NNGO |
89,651 |
3.258 |
1.194 |
| UN |
1,245,381 |
52 |
11 |
There is no real difference between the average numbers of
beneficiaries reached by INGOs and NNGOs; however, the geographical
reach of INGOs is markedly greater, perhaps due to the much tighter
geographical focus of several community-based organisations. There is
only one agency in the “UN” category for implementing partner type –
WFP.
The only notable thing about the donor column is its
incompleteness, which is understandable – only 43% (representing only
10% of all reported beneficiary frequencies) of the rows are filled.
Additionally, we also observe a number of errors, including cases where
multiple donors have been combined into one row as well as numerous
instances where WFP, FAO and UN WOMEN were classified as donors as
opposed to reporting organisations. Not much useful analysis can be
extracted from this column at present.
4. Beneficiaries
4.1 Beneficiary disaggregations
Currently, in the 5Ws, the vast majority of beneficiary
diasaggregations have been backfilled from census data and do not,
consequently, provide an accurate picture of the population that have
been reached bu Food Security interventions. It is not possible to
determine how far reality diverges from what has been reported so far –
meaning that we also cannot determine if there has been any bias in
beneficiary selection and targetting. It is imperative to begin
collecting disaggregated beneficiary data from partners.
It is entirely possible that partners are collecting this data –
disaggregated beneficiary data is one of the most common data required
for internal and external reporting – and that it is merely necessary to
work with partners to wrangle their data into the 5W format. However,
the capacities of partners to disaggregate beneficiary data should be
investigated by the cluster and is an important issues that should be
brought up in te next plenary session.
4.2 Types of beneficiaries
The states and sub-regions in which we are working the most with IDPs
are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 75.27%
of beneficiaries are from the host/local community, 14.08% are stateless
persons from Rakhine and 10.54% are IDPs. Returnees are the rarest type
of beneficiary reached, forming only 0.11% of all beneficiaries reached.
Each row in the table below shows the percentage of each beneficiary
type within each state/region.
Beneficiary types by state/region
|
state
|
Host/local Community
|
Internally Displaced
|
Returnees
|
Rakhine stateless
|
beneficiaries
|
|
Ayeyarwady
|
100.00
|
0.00
|
0.00
|
0.00
|
55,276
|
|
Bago (East)
|
0.00
|
100.00
|
0.00
|
0.00
|
4,312
|
|
Chin
|
9.23
|
90.77
|
0.00
|
0.00
|
13,550
|
|
Kachin
|
6.49
|
91.80
|
1.71
|
0.00
|
87,452
|
|
Kayah
|
45.89
|
54.11
|
0.00
|
0.00
|
15,920
|
|
Kayin
|
89.99
|
10.01
|
0.00
|
0.00
|
46,932
|
|
Magway
|
100.00
|
0.00
|
0.00
|
0.00
|
1,695
|
|
Mandalay
|
100.00
|
0.00
|
0.00
|
0.00
|
24,829
|
|
Mon
|
91.68
|
6.52
|
1.80
|
0.00
|
43,442
|
|
Rakhine
|
19.17
|
12.50
|
0.00
|
68.33
|
430,247
|
|
Sagaing
|
100.00
|
0.00
|
0.00
|
0.00
|
8,090
|
|
Shan (East)
|
100.00
|
0.00
|
0.00
|
0.00
|
510
|
|
Shan (North)
|
25.69
|
74.31
|
0.00
|
0.00
|
71,677
|
|
Shan (South)
|
100.00
|
0.00
|
0.00
|
0.00
|
9,304
|
|
Yangon
|
100.00
|
0.00
|
0.00
|
0.00
|
1,274,906
|
|
Total
|
75.27
|
10.54
|
0.11
|
14.08
|
NA
|
Compared to only the 2021 HRP targets (as the IERP does not have
breakdowns of the target by beneficiary type), we can see that whilst
targets have been mostly exceeded, neither the targets for
returnees/resettled in Kachin or Shan (North) nor targets for IDPs in
Rakhine or Kayin have been met. Interestingly, for Rakhine, the targets
for the host/local population have been greatly exceeded. In Bago
(East), Chin, and particularly Shan (North), the targets for IDPs have
been greatly exceeded, in comparison to the 2021 HRP targets:
Percentage of 2021 HRP target reached by beneficiary
type
| Bago (East) |
NA |
171.6 |
NA |
NA |
171.6 |
| Chin |
0 |
200.7 |
NA |
NA |
156.9 |
| Kachin |
72.94 |
108.8 |
32.88 |
NA |
101.5 |
| Kayin |
NA |
68.5 |
NA |
NA |
97.4 |
| Rakhine |
185.4 |
32.66 |
NA |
105.8 |
88.31 |
| Shan (North) |
132 |
743 |
0 |
NA |
394.9 |
| Shan (South) |
0 |
NA |
NA |
NA |
0 |
Stateless persons from Rakhine have the largest average household
sizes, and the largest variations in household size. The thick bar in
the middle of each box shows the average household size for each
beneficiary type – this value is also shown in the text label below the
line. The lower and upper borders of each box indicate the values for
the 25th and 75th percentiles respectively. For instance, we can see
that households at the 25th percentile of households in host/local
communities have only one member and households that have around 5
members have more members than 75% of all the households in that group.
Outliers are marked by dots. We note a lot of potential data entry
errors where less than one person per household have been recorded.

4.3 Beneficiaries by activity frequency
The categories “First” and “Monthly” in the frequency column do not
seem to be filled as intended, as can be seen from the plot below:

The assumption for these categories is that the first instance of a
beneficiary receiving support (as part of a continuing monthly support
package) would fall under the category “First” and every subsequent time
they received support, it would be under “Monthly”.
But we can see that this is not the case – monthly beneficiaries
predated the use of the “First” category by at least four months;
furthermore, the spike in first-time beneficiaries in May 2021 was not
accompanied by any increase in monthly beneficiaries in the subsequent
months – in fact, there was a decline in monthly beneficiaries.
Complicating all this is that we are not sure which of the beneficiaries
track beneficiaries in a comprehensive manner i.e. with a beneficiary
database and beneficiary ID cards. All this indicates that – after
confirming this with partners – we should abandon the “First” category
and recode these entries as “One-off”.
4.4 Gaps in monthly programming
Number of beneficiaries and locations by duration of gaps in
implementation
| 0 |
257 |
33 |
457,591 |
75.39 |
| 1 |
26 |
15 |
54,078 |
8.91 |
| 2 |
94 |
15 |
57,032 |
9.4 |
| 3 |
4 |
4 |
36,648 |
6.04 |
| 4 |
6 |
3 |
277 |
0.05 |
| 5 |
4 |
2 |
1,360 |
0.22 |
75% of beneficiaries experienced no gaps in monthly programming and
very long gaps of 4 or 5 months are quite rare; of the beneficiaries who
did experience gaps in monthly coverage, most experienced gaps of 1-2
months. The 10 townships which experienced the longest average gaps
between “monthly” activities were: Mohnyin, Myitkyina, Hpakant, Mogaung,
Chipwi and Waingmaw in Kachin; Shwepyithar in Yangon; Demoso and Loikaw
in Kayah; and Kutkai in Shan. Overall, 12 townships in Kachin
experienced gaps in the implementation of monthly activities; 6 in
Rakhine; 2 each in Ayeyarwady, Kayah and Shan; and 1 in Yangon. It
should be explored whether the delays in these areas were due to access
issues or other other constraints.
There are 167 entries coded as being implemented on a monthly basis
that have not recurred – that is, they have only been implemented once:
we should check with partners if these are merely the first instances or
if they are errors in data entry or if there have been issues with
access, security or funding.
4.5 Potential for post-distribution monitoring
The table below shows activities which have been implemented for 6
months or more, the number of locations they were implemented in and the
number of unique beneficiaries reached by activities meeting these
criteria. The possibility of joint monitoring – or at least the joint
review and analysis of monitoring data – will be explored, in
consultation with these partners. The rationale being that 6 months of
implementation should be a long enough period of time to make impact
monitoring feasible; additionally, joint monitoring will be further
facilitated by the similarity of these activities, almost all of which
are recurrent cash transfers or distributions of food baskets.
Number of unique beneficiaries which have received at least 6
months of recurrent food security support
| Provide monthly cash-based transfers |
6 |
232 |
183,237 |
| Provide monthly food baskets |
7 |
39 |
141,652 |
| Provide technical training |
1 |
12 |
300 |
The partners which have implemented activities fitting these criteria
are WFP, Karuna Mission Social Solidarity, World Vision Myanmar, Myanmar
Open Heart Development Organisation, People for People and Plan
International for monthly cash transfers; World Vision Myanmar, Myanmar
Open Heart Development Organisation, Action for Green Earth, People Hope
Community Development (PHCD), Together for Sustainable Development,
Karuna Mission Social Solidarity and WFP for monthly food baskets; and
the Da-Nu National Affairs Organisation (DNAO) for technical
training.
LS0tDQp0aXRsZTogIkluaXRpYWwgb2JzZXJ2YXRpb25zIG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciA1V3MiDQphdXRob3I6ICJTZWFuIE5nIg0KZGF0ZTogIjIyLzAxLzIwMjEiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KLS0tDQoNCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyByZXBvcnQgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGluaXRpYWwgb2JzZXJ2YXRpb25zIGFuZCBhbmFseXNpcyBwZXJmb3JtZWQgb24gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciA1V3MgZGF0YSBmb3IgdGhlIGZpcnN0IHRocmVlLXF1YXJ0ZXJzIG9mIDIwMjE7IHRoZSBpc3N1ZXMgaWRlbnRpZmllZCBhbmQgYW5hbHlzaXMgaGF2ZSBiZWVuIGJyb2tlbiBpbnRvIGxhcmdlIGdyb3VwcyBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IDQgY2hhcHRlcnMgLS0gZ2VvZ3JhcGhpY2FsIGNvdmVyYWdlLCBhY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzLCBwYXJ0bmVycyBhbmQgYmVuZWZpY2lhcmllcy4gVGhpcyByZXBvcnQgZW5kcyB3aXRoIGEgYnJpZWYgc2VjdGlvbiBvbiBuZXh0IHN0ZXBzIGFuZCBhbiBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUgYW5kIHJlZmVyZW5jZSBtYXAuIA0KDQpXZSBoYXZlIGVuZGVhdm91cmVkIHRvIHByb3ZpZGUgYWN0aW9uYWJsZSBpbmZvcm1hdGlvbiBhbmQgYmVsaWV2ZSB0aGF0IHJlbGVhc2luZyB0aGlzIHJlcG9ydCBpcyBhIG5lY2Vzc2FyeSBwYXJ0IG9mIGp1bXBzdGFydGluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHZpbmcgdGhlIG1vcmUgcHJlc3NpbmcgY29uY2VybnMgaWRlbnRpZmllZC4gRnVydGhlciBhbmFseXNpcyBpcyBtZXJpdGVkIGluIHNldmVyYWwgYXJlYXM7IGFuZCB0aGlzIHdpbGwgYmUgdW5kZXJ0YWtlbiBvbmNlIGNvbnN1bHRhdGlvbnMgd2l0aCBwYXJ0bmVycyBoYXZlIGJlZW4gY29tcGxldGVkLiANCg0KVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGJlbmVmaWNpYXJ5IGZpZ3VyZXMgaW4gdGhpcyByZXBvcnQgYXJlIHRoZSBudW1iZXIgb2YgdW5pcXVlIGJlbmVmaWNpYXJpZXMsIGFzIG9wcG9zZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMuIA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9ICIwIiwgYWRtaW4zX3Bjb2RlID0gIjAiLCBhZG1pbjFfcGNvZGUgPSAiMCIpKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsMTlfKGluY2x1ZGVkIEFsbCBJUCBSZXBvcnRzKV9KYW4gdG8gU2VwIDIwMjFfSU0gQ29tYmluZWRfRmluYWwueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIikpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiICIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV9tbWsgPSB2YWx1ZV9wZXJfaG91c2Vob2xkICogaG91c2Vob2xkcykgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG15KG1vbnRoX29mX2ltcGxlbWVudGF0aW9uKSkgJT4lIA0KICBtdXRhdGUodV9iZW4gPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSkpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gY2FzZV93aGVuKHZhbHVlX3Blcl9ob3VzZWhvbGQgPCAxMDAwMCB+ICJiZWxvd18xMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDEwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAyMDAwMCB+ICIxMGtfMjBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDIwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA1MDAwMCB+ICIyMGtfNTBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDUwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA3MDAwMCB+ICI1MGtfNzBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDcwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwMCB+ICI3MGtfMTAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDIwMDAwMCB+ICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDIwMDAwMCAmIHZhbHVlX3Blcl9ob3VzZWhvbGQgPD0gMzAwMDAwIH4gIjIwMGtfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPiAzMDAwMDAgfiAiYWJvdmVfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIGMoImxlc3NfdGhhbl8xMGsiLCAiMTBrXzIwayIsIjIwa181MGsiLCAiNTBrXzcwayIsICI3MGtfMTAwayIsICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMGtfMzAwayIsIm1vcmVfdGhhbl8zMDBrIikpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVjb2RlKGZyZXF1ZW5jeSwgIm1vbnRobHkiID0gIk1vbnRobHkiKSkgJT4lDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMCB+ICI8JDEwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDEwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA0MCB+ICI+PSQyMF88JDQwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDQwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA2MCB+ICI+PSQ0MF88JDYwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDYwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMDAgfiAiPj0kNjBfPCQxMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMDAgfiAiPj0kMTAwXzwkMjAwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwMCB+ICI+PSQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiPCQxMCIsICI+PSQxMF88JDIwIiwgIj49JDIwXzwkNDAiLCAiPj0kNDBfPCQ2MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNjBfPCQxMDAiLCAiPj0kMTAwXzwkMjAwIiwgIj49JDIwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiLA0KICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0LCBjb250cmlidXRpbmcgdG8gaG91c2Vob2xkIGZvb2Qgc2VjdXJpdHkiID0NCiAgICAgICAgICAgICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSByZWNvZGUoYWN0aXZpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyB0aHJvdWdoIGluLWtpbmQgYXNzaXN0YW5jZSB0byBhY3V0ZWx5IGZvb2QgaW5zZWN1cmUgcG9wdWxhdGlvbiBpbiBydXJhbCBhcmVhcyIgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyAoYWdyaWN1bHR1cmUsIGxpdmVzdG9jayBicmVlZGluZywgbGl2ZWxpaG9vZCkiID0gIlByb3ZpZGUgdGVjaG5pY2FsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgc3VwcG9ydCBmb3IgSW5jb21lIEdlbmVyYXRpbmcgQWN0aXZpdGllcyIgPSAiUHJvdmlkZSBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMgYWN0aXZpdGllcyIgPSAiQ2FzaCBmb3IgV29yayAvIEZvb2QgZm9yIEFzc2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGZpc2hlcnkga2l0cyAoaW4ta2luZCAvIENCVCkiID0gIlByb3ZpZGUgZmlzaGVyeSBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgY3JvcHMgJiB2ZWdldGFibGVzIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbGl2ZXN0b2NrIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGxpdmVzdG9jayBraXRzIikpDQoNCg0KIyBiZW4gZGF0YXNldCAtLSB0aWR5IGZvcm1hdCA1V3MgZm9yIGJlbmVmaWNpYXJpZXMgDQpiZW4gPC0gZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgIA0KICBzZWxlY3QoZGF0ZSwNCiAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycywgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwNCiAgICAgICAgIHN0YXRlLCB0b3duc2hpcCwgdmlsbGFnZV93YXJkX3Rvd24sIGxvY2F0aW9uLCBsb2NhdGlvbl90eXBlLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSwNCiAgICAgICAgIGFjdGl2aXR5LCBhY3Rpdml0eV9zdGF0dXMsIGhycF9pbmRpY2F0b3IsIGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgY2hpbGRfbWFsZSwgY2hpbGRfZmVtYWxlLCBhZHVsdF9tYWxlLCBhZHVsdF9mZW1hbGUsIGVsZGVybHlfbWFsZSwgZWxkZXJseV9mZW1hbGUpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjaGlsZF9tYWxlOmVsZGVybHlfZmVtYWxlLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImRpc2FnZ3JlZ2F0aW9uIiwgdmFsdWVzX3RvID0gImJlbmVmaWNpYXJpZXMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpDQogDQoNCiMgcmVhZGluZyBpbiBwaW4gYW5kIHRhcmdldHMNCnBpbiA8LSByZWFkX2V4Y2VsKCJQSU4gY2FsY3VsYXRpb24gRm9vZCBTZWN1cml0eSBDbHVzdGVyX1Rvd25zaGlwIEJyZWFrZG93bi54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiRm9vZCBTZWMgUGlOIHdpdGggSURQcyIsIA0KICAgICAgICAgICBza2lwID0gMikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1jKHgxNywgeDE4LCB4MTkpKSAlPiUgDQogIHNsaWNlKDE6MzQ2KSAlPiUgDQogIGZpbGwocmVnaW9uKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwNCiAgICAgICAgIGlkcHMgPSBpZF9wcywgDQogICAgICAgICBwb3BfbWludXNfaWRwcyA9IHBvcHVsYXRpb25fbWludXNfaWRfcHMsIA0KICAgICAgICAgcGluXzIwMjIgPSB2dWxuZXJhYmxlX2Zvb2RfaW5zZWN1cmVfcGVvcGxlX2lkX3BzKSAlPiUgIA0KICBmaWx0ZXIodG93bnNoaXAgIT0gIlRvdGFsIikgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMocG9wX21pbnVzX2lkcHM6bW9kZXJhdGVseV9zZXZlcmVseSksIH4gYXMubnVtZXJpYyguKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzLCBieSA9IGMoInRvd25zaGlwIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgc2VsZWN0KC1zdGF0ZSkgJT4lICANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlKSAlPiUgcmVsb2NhdGUoc3RhdGUgPSBzdGF0ZV9uYW1lKSAlPiUgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogIG11dGF0ZShwY192dWwgPSBwaW5fMjAyMiAvIHRvdGFsX3BvcCwNCiAgICAgICAgIHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJGU0MgUElOIGFuZCBUYXJnZXQgX2NvbWJpbmUgSFJQIGFuZCBJRVJQIDIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlID0gdHNwX3Bjb2RlLCBwaW5fMjAyMSA9IHBpbiwgdGFyZ2V0XzIwMjEgPSB0YXJnZXQpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJmc190YXJnZXRzXzIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHRvd25zaGlwID0geDEsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X2lkcHNfMjAyMSA9IGludGVybmFsbHlfZGlzcGxhY2VkX3BlcnNvbnNfMTIsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxID0gaWRwX3JldHVybmVlc19yZXNldHRsZWRfbG9jYWxseV9pbnRlZ3JhdGVkXzEzLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxID0gbm9uX2Rpc3BsYWNlZF9zdGF0ZWxlc3NfcGVvcGxlX2luX3Jha2hpbmVfMTQsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X290aGVyX3Z1bG5lcmFibGVfMjAyMSA9IG90aGVyX3Z1bG5lcmFibGVfY3Jpc2lzX2FmZmVjdGVkX3Blb3BsZV8xNSwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfdG90YWwgPSB0b3RhbF8xNikgJT4lDQogICAgICAgICAgICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdG93bnNoaXApLA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAgICANCg0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUpDQoNCiMgZm9yIHJlbGV2ZWxsaW5nIC0tIHRoaXMgaXMgaW4gb3JkZXIgb2YgYmVuZWZpY2lhcmllcw0Kc3Jfb3JkIDwtIGMoIllhbmdvbiIsICJSYWtoaW5lIiwgIkthY2hpbiIsICJTaGFuIChOb3J0aCkiLCAiQXlleWFyd2FkeSIgLCAiS2F5aW4iLCAiTW9uIiwgIk1hbmRhbGF5IiwNCiAgICAgICAgICAgICJLYXlhaCIsICJDaGluIiwgIlNoYW4gKFNvdXRoKSIsICJTYWdhaW5nIiwgIkJhZ28gKEVhc3QpIiwgIk1hZ3dheSIsICJTaGFuIChFYXN0KSIsICJCYWdvIChXZXN0KSIsICJUYW5pbnRoYXJ5aSIpDQoNCiMgZm9yIHByaW50aW5nIHRoZSB0YXJnZXRzIG9mIHRoZSBwaW4gDQp0YXJnZXRfYmVuXzIwMjEgPC0gcGluICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0XzIwMjEpICU+JSANCiAgZmlsdGVyKHRhcmdldF8yMDIxID4gMCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGJlbmVmaWNpYXJpZXMgLyB0YXJnZXRfMjAyMSAqIDEwMCkgJT4lICANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgDQoNCmBgYA0KDQoNCiMjIDEuIEdlb2dyYXBoaWNhbCBjb3ZlcmFnZQ0KDQojIyMgMS4xIENvbXBhcmluZyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIDIwMjEgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KQSB0b3RhbCBvZiBgciBzdW0oYmVuJGJlbmVmaWNpYXJpZXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB1bmlxdWUgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgdGhlIGNvdW50cnk7IHRoaXMgaXMgYHIgcm91bmQoc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAvIHN1bShwaW4kdGFyZ2V0XzIwMjEpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSB0YXJnZXR0ZWQgYHIgc3VtKHBpbiR0YXJnZXRfMjAyMSkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnM7IGhvd2V2ZXIsIG5vdCBhbGwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBjb3JyZXNwb25kZWQgdG8gYXJlYXMgd2hlcmUgdGhlcmUgd2VyZSB0YXJnZXRzIC0tIHRoaXMgaXMgZXhwbG9yZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdG93bnNoaXBzLg0KDQo8YnI+DQoNCg0KYGBge3IgYmFycGxvdC1zdGF0ZS1iZW5lZmljaWFyaWVzLXBpbn0NCiMgYWRkIGEgdGhpcmQgY29sdW1uIGZvciB0YXJnZXQgZm9yIGFsbCB0aGUgYmFycGxvdHMgDQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSBzdW0odGFyZ2V0XzIwMjEpLCANCiAgICAgICAgICAgIHBpbl8yMDIxID0gc3VtKHBpbl8yMDIxKSkgJT4lIA0KICBmaWx0ZXIocGluXzIwMjEgPiAwIHwgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3RfbG9uZ2VyKC1zdGF0ZSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IGZjdF9yZWxldmVsKHR5cGUsIGMoImJlbmVmaWNpYXJpZXMiLCAidGFyZ2V0XzIwMjEiLCAicGluXzIwMjEiKSkpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkICgyMDIxKSIpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkNCmBgYA0KDQo8YnI+DQoNCiMjIyAxLjIgVGFibGUgb2YgYmVuZWZpY2lhcmllcyBhbmQgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyaWVzLXBpbi1zdGF0ZX0NCiMgY2hhbmdlIGZvcm11bGFzIHRvIGxvb2sgYXQgJSBvZiB0YXJnZXQgYW5kIHNob3cgUElOLCB0YXJnZXQgYW5kIGFjaGlldmVtZW50IGluIHRoZSB0YWJsZSANCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0YXJnZXQgPSByb3VuZChzdW0odGFyZ2V0XzIwMjEpLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICAgICBQSU4gPSByb3VuZChzdW0ocGluXzIwMjEpLCBkaWdpdHMgPSAwKSkgJT4lDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IFBJTiA+IDApICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX3RhcmdldF9yZWFjaGVkYCA9IGlmZWxzZShpcy5pbmZpbml0ZShiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwgTkFfcmVhbF8sIGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDApLA0KICAgICAgICAgYCVfdGFyZ2V0X3JlYWNoZWRgID0gcm91bmQoYCVfdGFyZ2V0X3JlYWNoZWRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUoYCVfdGFyZ2V0X3JlYWNoZWRgLCAuYWZ0ZXIgPSB0YXJnZXQpICU+JSANCiAgcmVsb2NhdGUoYCVfb2ZfdGFyZ2V0YCwgLmFmdGVyID0gdGFyZ2V0KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgUElOIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KPGJyPg0KDQpZYW5nb24gYW5kIFJha2hpbmUgZm9ybSBib3RoIGByIHJvdW5kKGZpbHRlcihwaW4sIHN0YXRlICVpbiUgYygiWWFuZ29uIiwgIlJha2hpbmUiKSkgJT4lIHtzdW0oLiR0YXJnZXRfMjAyMSl9IC8gc3VtKHBpbiR0YXJnZXRfMjAyMSkgKiAxMDApYCUgb2YgdGhlIHRhcmdldCBhbmQgYHIgcm91bmQoZmlsdGVyKGZzYywgc3RhdGUgJWluJSBjKCJZYW5nb24iLCAiUmFraGluZSIpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9IC8gZmlsdGVyKGZzYywgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICogMTAwKWAlIG9mIHRoZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIE1hbmRhbGF5IGhhcyBoYXMgdGhlIGxhcmdlc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldHMgYW5kIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gVGhlcmUgd2VyZSBmb3VyIHN0YXRlcyAoQXlleWFyd2FkeSwgTW9uLCBTYWdhaW5nIGFuZCBNYWd3YXkpIHdoZXJlIGJlbmVmaWNpYXJpZXMgd2VyZSByZWFjaGVkIGJ1dCB3ZXJlIG5vdCBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSAyMDIxIHRhcmdldCBvciBQSU47IGhvd2V2ZXIsIHRoZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gdGhlc2UgYXJlYXMgcmVwcmVzZW50IGxlc3MgdGhhbiA1JSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBBZGRpdGlvbmFsbHksIHRhcmdldHMgaGF2ZSBiZWVuIGV4Y2VlZGVkIGluIDcgc3RhdGVzLCB3aXRoIEtheWluIGhhdmluZyByZWFjaGVkIDY4NCUgb2YgaXRzIHRhcmdldCBvZiA2LDg1NSBwZXJzb25zLiANCg0KSG93ZXZlciwgbW92aW5nIGZvcndhcmQsIHRoZSBQSU4gZm9yIDIwMjIgaXMgbXVjaCBtb3JlIGV2ZW5seSBzcHJlYWQgYWNyb3NzIHRoZSBjb3VudHJ5OiB3aXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBiZWxvdywgWWFuZ29uLCBhbG9uZyB3aXRoIE1hZ3dheSBhbmQgTWFuZGFsYXkgaGF2ZSBzb21lIG9mIHRoZSBsb3dlc3QgcHJvcG9ydGlvbnMgb2YgdnVsbmVyYWJsZSBwZXJzb25zIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBzdGF0ZSBwb3B1bGF0aW9uLCBtZWFuaW5nIHRoYXQgY2FyZWZ1bCBiZW5lZmljaWFyeSBzZWxlY3Rpb24gYW5kIHRpZ2h0IHZ1bG5lcmFiaWxpdHkgaW4gdGhlc2UgYXJlYXMgd2lsbCBuZWNlc3NhcnkgdG8gYXZvaWQgZXhjZXNzaXZlIGluY2x1c2lvbiBlcnJvcnMuIA0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtcGluLXZ1bC1zdGF0ZX0NCnBpbiAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIGZpbHRlcihzdGF0ZSAhPSAiTmF5IFB5aSBUYXciKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHJvdW5kKHN1bShwaW5fMjAyMikpLA0KICAgICAgICAgICAgdG90YWxfcG9wID0gc3VtKHRvdGFsX3BvcCkpICU+JSANCiAgbXV0YXRlKGB2dWxuZXJhYmxlJWAgPSByb3VuZChwaW5fMjAyMiAvIHRvdGFsX3BvcCAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBzdGF0ZSA9IHJlb3JkZXIoc3RhdGUsIC1gdnVsbmVyYWJsZSVgKSkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBwaW5fMjAyMiwgZmlsbCA9IGB2dWxuZXJhYmxlJWApKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYHZ1bG5lcmFibGUlYCksIHNpemUgPSAyLjUsIHZqdXN0ID0gLTAuNSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDcwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAwLjYpKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkIiwgDQogICAgICAgdGl0bGUgPSAiMjAyMiBQSU4gYW5kIGluY2lkZW5jZSBvZiB2dWxuZXJhYmlsdHkgYnkgc3RhdGUgYW5kIHJlZ2lvbiIsDQogICAgICAgc3VidGl0bGUgPSAiVnVsbmVyYWJpbGl0eSBpcyBkZWZpbmVkIGhlcmUgYXMgdGhlIHByb3BvcnRpb24gb2YgYSBwb3B1bGF0aW9uIHdobyBhcmUgZm9vZCBpbnNlY3VyZSBvciBhcmUgSURQcyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAwMDAwLCBieSA9IDIwMDAwMCksIGxhYmVscyA9IGNvbW1hKSArDQogIHNjYWxlX2ZpbGxfY29udGludW91cyh0cmFucyA9ICJyZXZlcnNlIikNCmBgYA0KDQo8YnI+DQoNCg0KIyMjIDEuMyBUb3duc2hpcC1sZXZlbCBkaXN0cmlidXRpb24gb2YgYmVuZWZpY2lhcmllcw0KDQpKdXN0IGFzIHRoZSByZXNwb25zZSBpcyBoZWF2aWx5IHdlaWdodGVkIHRvd2FyZHMgWWFuZ29uIGFuZCBSYWtoaW5lIGF0IHRoZSBzdGF0ZSBhbmQgcmVnaW9uIGxldmVsLCB0aGUgc2FtZSBpcyB0cnVlIGF0IHRoZSB0b3duc2hpcCBsZXZlbCBhcyB3ZWxsLiBUaGVzZSAxMCB0b3duc2hpcHMgYmVsb3cgYXJlIHdoZXJlIDgwJSBvZiBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiByZWFjaGVkIGNvbGxlY3RpdmVseSwgdGhleSByZXByZXNlbnQgNTMlIG9mIHRoZSAyMDIxIHRhcmdldC4gSW4gcGFydGljdWxhciwgSGxhaW5ndGhhcnlhIGhhcyBiZW5lZmljaWFyeSBmaWd1cmVzIHRoYXQgYXJlIDM3OCUgb2YgaXRzIHRhcmdldC4gQWRkaXRpb25hbGx5LCBuZWl0aGVyIEthd2FyZWlrIGluIEtheWluIG9yIEt5YWlrbWFyYXcgaW4gTW9uIHdlcmUgdGFyZ2V0dGVkIGFzIHBhcnQgb2YgdGhlIDIwMjEgUElOIGRlc3BpdGUgYmVpbmcgaW4gdGhlIHRvcCAxMCB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIG9ubHkgODguNSUgb2YgYmVuZWZpY2lhcmllcyBjb3JyZXNwb25kZWQgdG8gdG93bnNoaXBzIHdpdGggdGFyZ2V0cy4gIA0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzLWJlbmVmaWNpYXJpZXN9DQojIGNoZWNrIHRoZSBwYXJhZ3JhcGggdGV4dCBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIHJlcG9ydCBvbiBuZXcgZGF0YSANCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSwgdG93bnNoaXAsIHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbihwaW4gJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIHRhcmdldCA9IHRhcmdldF8yMDIxKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIG11dGF0ZShgJV9vZl9iZW5gID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJV9vZl90YXJnZXRgID0gaWZlbHNlKGlzLmluZmluaXRlKHRhcmdldCAvIHN1bSh0YXJnZXQsIG5hLnJtID0gVFJVRSkgKiAxMDApLCBOQV9yZWFsXywgdGFyZ2V0IC8gc3VtKHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMCksDQogICAgICAgICBgJV9vZl90YXJnZXRgID0gcm91bmQoYCVfb2ZfdGFyZ2V0YCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJXJlYWNoZWRgID0gaWZlbHNlKGlzLmluZmluaXRlKGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDApLCBOQV9yZWFsXywgYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCksDQogICAgICAgICBgJXJlYWNoZWRgID0gcm91bmQoYCVyZWFjaGVkYCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KC1hZG1pbjNfcGNvZGUpICU+JSANCiAgcmVsb2NhdGUoYCVfb2ZfYmVuYCwgLmFmdGVyID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICByZWxvY2F0ZShzdGF0ZSwgLmFmdGVyID0gdG93bnNoaXApICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGhlYWQoMTApICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiVG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMSIpDQpgYGANCg0KPGJyPg0KDQpgciBiZW4gJT4lIHNlbGVjdCh0b3duc2hpcCkgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgdG93bnNoaXBzIGhhdmUgYmVlbiByZWFjaGVkIGJ5IGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcyBpbiB0aGUgZmlyc3QgdGhyZWUtcXVhcnRlcnMgb2YgMjAyMS4gVGhpcyBpcyBsZXNzIHRoYW4gYSB0aGlyZCBvZiB0aGUgMzMwIHRvd25zaGlwcyBpbiB0aGUgY291bnRyeS4gSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRocmVlIHRvd25zaGlwcyAtLSBIcGFwdW4gaW4gS2F5aW4sIE11c2UgaW4gU2hhbiAoTm9ydGgpIGFuZCBLeWV0aGkgaW4gU2hhbiAoU291dGgpIGhhdmUgYmVlbiB0YXJnZXR0ZWQgc2luY2UgdGhlIGluaXRpYWwgMjAyMSBIUlAsIHlldCBoYXZlIG5vdCBiZWVuIHJlYWNoZWQgYnkgYW55IEZTQyBhY3Rpdml0aWVzOyAxMCB0b3duc2hpcHMsIG92ZXJhbGwsIGluIGVpdGhlciB0aGUgSFJQIG9yIElFUlAsIGhhdmUgbm90IGJlbmVmaXR0ZWQgZnJvbSBhbnkgRlNDIGFjdGl2aXRpZXMuIA0KDQpPdmVyYWxsLCBgciByb3VuZChzdW0odGFyZ2V0X2Jlbl8yMDIxJGJlbmVmaWNpYXJpZXMpIC8gc3VtKHRhcmdldF9iZW5fMjAyMSR0YXJnZXRfMjAyMSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgdGhlIHRhcmdldHRlZCBwb3B1bGF0aW9uIHdhcyByZWFjaGVkLiBGcm9tIHRoZSBoaXN0b2dyYW0gYmVsb3csIHdlIGNhbiBzZWUgdGhhdCBvdmVycmVhY2ggYW5kIHVuZGVyLXJlYWNoaW5nIGFyZSB2ZXJ5IGNvbW1vbiBhdCB0aGUgdG93bnNoaXAgbGV2ZWwgLS0gdG93bnNoaXBzIGFyZSBjb21tb25seSBjbHVzdGVyZWQgYXQgYXJvdW5kIDAlIHJlYWNoZWQgYW5kIGFsc28gYXQgMjAwJSByZWFjaGVkIG9yIG1vcmUuIE9mIHRoZSA1MSB0b3duc2hpcHMgdGFyZ2V0dGVkIGluIDIwMjE7IDIxIHRvd25zaGlwcyByZWFjaGVkIG1vcmUgdGhhbiAxMjAlIG9mIHRoZWlyIHRhcmdldCwgNCByZWFjaGVkIGJldHdlZW4gMTAwJSBhbmQgMTE5JSBvZiB0aGVpciB0YXJnZXQ7IDcgdG93bnNoaXBzIHJlYWNoZWQgYmV0d2VlbiA4MCUgYW5kIDEwMCUgb2YgdGhlaXIgdGFyZ2V0OyBhbmQgMiB0b3duc2hpcHMgcmVhY2hlZCBsZXNzIHRoYW4gODAlIG9mIHRoZWlyIHRhcmdldC4gIA0KDQo8YnI+DQoNCmBgYHtyIGhpc3RvZ3JhbS1iZW5lZmljaWFyaWVzLWhycC10YXJnZXQtcmVhY2hlZH0NCg0KcGluICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0XzIwMjEpICU+JSANCiAgZmlsdGVyKHRhcmdldF8yMDIxID4gMCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGJlbmVmaWNpYXJpZXMgLyB0YXJnZXRfMjAyMSAqIDEwMCkgJT4lICANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGlmZWxzZShwY19yZWFjaGVkID4gMjAwLCAyMDAsIHBjX3JlYWNoZWQpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjApICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwLCBieSA9IDIwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwLCBieSA9IDIpKSArIA0KICBsYWJzKHggPSAiJSBvZiAyMDIxIEhSUCB0YXJnZXQgcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHRvd25zaGlwcyIsDQogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRvd25zaGlwcyBieSBwZXJjZW50YWdlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgc3VidGl0bGUgPSAiVmFsdWVzIGFib3ZlIDIwMCUgaGF2ZSBiZWVuIGx1bXBlZCB0b2dldGhlciBhdCAyMDAlIikNCmBgYA0KDQo8YnI+DQoNCiMjIyAxLjQgTG9jYXRpb25zDQoNClBhcnRuZXJzIGhhdmUgcmVzcG9uZGVkIGluIGEgdG90YWwgb2YgYHIgYmVuICU+JSBzZWxlY3QobG9jYXRpb24pICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGxvY2F0aW9ucyBhY3Jvc3MgdGhlIGNvdW50cnksIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgbG9jYXRpb25zIG9ubHkgaGF2aW5nIG9ubHkgb25lIHBhcnRuZXIgb3BlcmF0aW5nIGluIHRoZW07IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0bmVycyBpbiBhbnkgbG9jYXRpb24gaXMgMy4gT2YgdGhlIGByIGZzYyAlPiUgbnJvdygpYCByb3dzIHJlcG9ydGVkIGluIHRoZSA1V3MsIG9ubHkgYHIgc3VtKGlzLm5hKGZzYyRsb2NhdGlvbikpYCBkaWQgbm90IHJlcG9ydCBhIHNwZWNpZmljIGxvY2F0aW9uLg0KDQpMb2NhdGlvbnMgYXJlIGNsYXNzaWZpZWQgaW50byB0aHJlZSBncm91cHMgLS0gY2FtcHMsIGluZHVzdHJpYWwgem9uZXMgYW5kIHZpbGxhZ2VzL3Rvd25zL3dhcmRzOg0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnN9DQoNCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBhdmdfYmVuX3Blcl9sb2MgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gbG9jYXRpb25zLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiU3VtbWFyeSBvZiBsb2NhdGlvbiB0eXBlcyIpDQpgYGANCg0KPGJyPg0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgYXJlIHNlcnZlZCBieSBvbmx5IG9uZSBwYXJ0bmVyLiBCZWxvdyBhcmUgYSBzZXJpZXMgb2YgaGlzdG9ncmFtcyBzaG93aW5nIHRoZSB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uLCBzcGxpdCBieSBudW1iZXIgb2YgcGFydG5lcnMgaW4gZWFjaCBsb2NhdGlvbjoNCg0KYGBge3IgaGlzdG9ncmFtLWxvY2F0aW9ucy1ieS1wYXJ0bmVyfQ0KDQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwYXJ0bmVycykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgc2NhbGVfeF9sb2cxMCgpICsNCiAgZmFjZXRfd3JhcCh+IHBhcnRuZXJzKSArDQogIGxhYnMoeSA9ICJudW1iZXIgb2YgbG9jYXRpb25zIiwNCiAgICAgICB4ID0gImJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtcyBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyBwZXIgbG9jYXRpb24iKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgbW9yZSBwYXJ0bmVycyBvcGVyYXRpbmcgaW4gYSBnaXZlbiBsb2NhdGlvbiwgdGhlIGhpZ2hlciB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllczsgaG93ZXZlciwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlc2UgbXVsdGktcGFydG5lciBsb2NhdGlvbnMgYXJlIGNvbXBhcmF0aXZlbHkgcmFyZToNCg0KYGBge3IgdGFibGUtbG9jYXRpb25zLXBhcnRuZXJzfQ0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShwYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gc3VtKG5fZGlzdGluY3QobG9jYXRpb24pKSwNCiAgICAgICAgICAgIGF2Z19iZW5lZmljaWFyaWVzID0gbWVkaWFuKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbXV0YXRlKHBhcnRuZXJzID0gcmVjb2RlKHBhcnRuZXJzLCBgMWAgPSAib25lX3BhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gInR3b19wYXJ0bmVycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAidGhyZWVfcGFydG5lcnMiKSkgJT4lIA0KIHBhbmRlcigpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQoNCg0KIyMgMi4gQWN0aXZpdGllcyBhbmQgbW9kYWxpdGllcw0KDQojIyMgMi4xIFByb2dyZXNzIGJ5IGFjdGl2aXR5DQoNCmBgYHtyIGxpbmUtcGxvdC1mYWNldC1hY3Rpdml0eX0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gYWN0aXZpdHkpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiY3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMSBRMS1RMyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNClBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGFjaGlldmVtZW50cyBhY3Jvc3MgdGhlIGVpZ2h0IDVXIGFjdGl2aXRpZXMuIEFzIG5vdGUsIHdlIHNlZSB0aGF0IHRoZSBtYWpvcml0eSBvZiB0aGUgY2FzZWxvYWQgZm9yIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgd2FzIGVzdGFibGlzaGVkIHByaW9yIHRvIDIwMjEgKHdpdGggdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9ubHkgaW5jcmVhc2luZyB2ZXJ5IGluY3JlbWVudGFsbHkgYWNyb3NzIHRoZSBjb3Vlc2Ugb2YgdGhlIHllYXIpIC0tIHRoaXMgYWxpZ25zIHdpdGggb3VyIHVuZGVyc3RhbmRpbmcgdGhhdCBtYW55IG9mIHRoZSBwcm9qZWN0cyBjb250cmlidXRpbmcgdG8gdGhpcyBhY3Rpdml0eSB3ZXJlIG11bHRpLXllYXIgaW4gbmF0dXJlIGFuZCBoYWQgYmVlbiBvbmdvaW5nIHByaW9yIHRvIHRoZSBIUlAuIA0KDQpPbmUgb2YgdGhlIGRpZmZpY3VsdGllcyBvZiBpbnRlcnByZXRpbmcgdGhlc2UgZGF0YSBpcyB0aGF0IGl0IGlzIG5vdCBhbHdheXMgYXBwYXJlbnQgd2hlcmUgdGhlIHBhdHRlcm5zIG9ic2VydmVkIGFyZSByZWZsZWN0aXZlIG9yIGNoYW5nZXMgaW4gdGhlIGZpZWxkIChzdWNoIGFzIGNoYW5nZXMgaW4gYWNjZXNzLCBmdW5kaW5nIG9yIHN0YWZmaW5nKSBvciBpZiB0aGV5IGFyZSBpbnN0ZWFkIGR1ZSB0byBwYXJ0bmVycycgcmVwb3J0aW5nIGJlaGF2aW91cnMuIFdlIG5vdGUsIGZvciBpbnN0YW5jZSwgYSBsYXJnZSBqdW1wIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBmb3IgZmlzaGVyeSBpdHMgYW5kIGZvb2QgYmFza2V0cyBhcm91bmQgSnVseSAyMDIxIC0tIHRoaXMgd2FzIGR1ZSB0byB0aGUgbmV3bHktYXBwcm92ZWQgYWRkZW5kdW0gdG8gdGhlIEhSUC4gSG93ZXZlciwgc29tZSBvZiB0aGUgb3RoZXIgY2hhbmdlcyBhcmUgbGVzcyBjbGVhciBhbmQgd2lsbCByZXF1aXJlIGNhcmVmdWwgZXhwbG9yYXRpb24gd2l0aCBwYXJ0bmVycy4gDQoNCjxicj4NCg0KIyMjIDIuMiBEZWxpdmVyeSBtb2RhbGlsdGllcw0KDQpDYXNoIHdhcyB0aGUgbWFpbiBkZWxpdmVyeSBtb2RhbGl0eSBpbiBmb3VyIG91dCBvZiB0aGUgZWlnaHQgYWN0aXZpdGllcyB1bmRlciB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBmb2xsb3dlZCBieSAiaW4ta2luZCIsIHdoaWNoIHdhcyBwcmVkb21pbmFudGx5IGVtcGxveWVkIGluIHRocmVlLiBIb3dldmVyLCB0aGUgaW4ta2luZCBtb2RhbGl0eSBoYXMgdGhlIGhpZ2hlc3QgcmVhY2gsIGdpdmVuIHRoZSBlc3BlY2lhbGx5IGxhcmdlIGJlbmVmaWNpYXJ5IG51bWJlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzLiBXZSBhbHNvIG5vdGUgc2V2ZXJhbCBtaXNjbGFzc2lmaWNhdGlvbnMgLS0gc21hbGwgcG9ydGlvbnMgb2YgbW9udGhseSBjYXNoIHRyYW5zZmVycyBoYXZlIGJlZW4gY29kZWQgYXMgaW4ta2luZCBhbmQgdGhlcmUgYXJlIGluLWtpbmQgZm9vZCBiYXNrZXRzIGNvZGVkIGFzIGh5YnJpZC4gSXQgbWlnaHQgYWxzbyBiZSB3b3J0aCBtb3JlIGNsZWFybHkgZGVsaW5lYXRpbmcgYmV0d2VlbiAic3VwcG9ydCBmb3IgaW5jb21lLWdlbmVyYXRpbmcgYWN0aXZpdGllcyIgYW5kIHRoZSAicHJvdmlzaW9uIG9mIHRlY2huaWNhbCB0cmFpbmluZyIgYXMgc2VydmljZSBkZWxpdmVyeSBhbmQgc3VwcG9ydCBhcmUgaGVhdmlseSBwcmVzZW50IGluIGJvdGguDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC1hY3Rpdml0eS1tb2RhbGl0eX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShkZWxpdmVyeV9tb2RhbGl0eSA9IHJlY29kZShkZWxpdmVyeV9tb2RhbGl0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHlicmlkIChJbi1raW5kICYgQ2FzaCkiID0gIkh5YnJpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBkZWxpdmVyeS9zdXBwb3J0IiA9ICJTZXJ2aWNlcy9zdXBwb3J0IikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGVsaXZlcnlfbW9kYWxpdHksIHkgPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gYWN0aXZpdHkpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgdGl0bGUgPSAiRGVsaXZlcnkgbW9kYWxpdHkgYnkgYWN0aXZpdHksIDIwMjEgUTEtUTMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCjxicj4NCg0KYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkYmVuZWZpY2lhcmllcykgKiAxMDApYCUgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2ZWQgc3VwcG9ydCB0aHJvdWdoIHRoZSBpbi1raW5kIGRlbGl2ZXJ5IG1vZGFsaXR5OyB3ZSB1c2UgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaGVyZSBhcyB0aGVyZSB3ZXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mIG1vZGFsaXRpZXMgY2hhbmdpbmcgcGFydHdheSB0aHJvdWdoIGFuIGludGVydmVudGlvbjogZm9yIHJlZmVyZW5jZSwgYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJHVfYmVuKX0gLyBzdW0oZnNjJHVfYmVuKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbml0aWFsbHkgd2l0aCBpbi1raW5kIGludGVydmVudGlvbnMsIG1lYW5pbmcgdGhhdCB0aGVyZSB3YXMgYSB0ZW5kZW5jeSB0byBkaXZlcnNpZnkgYXdheSBmcm9tIGluLWtpbmQgc3VwcG9ydCBvdmVyIDIwMjEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJDYXNoIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tb2RhbGl0eS1mcmVxdWVuY3l9DQojIGNoYW5nZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW5zdGVhZCBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyANCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfVG90YWwgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgYnkgZGVsaXZlcnkgbW9kYWxpdGllcyBhbmQgZnJlcXVlbmN5IG9mIGRpc3RyaWJ1dGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClJlZ2FyZGluZyB0aGUgdGFibGUgYWJvdmUsIHRoZXJlIGlzIGEgc3Ryb25nIGFyZ3VtZW50IHRvIHJlbW92ZSB0aGUgb3B0aW9uICJvdGhlciIgZnJvbSB0aGUgNVcgY29sdW1uIGBmcmVxdWVuY3lgIChyZWZlcnJpbmcgdG8gZnJlcXVlbmN5IG9mIHRyYW5zZmVyL2RlbGl2ZXJ5KSAtLSB3aGF0IGV4YWN0bHkgaXQgY29ubm90ZXMgaXMgdW5jbGVhciwgYXMgcGFydG5lcnMgbWlnaHQgZWxlY3QgdGhpcyBvcHRpb24gZm9yIGFjdGl2aXRpZXMgdGhhdCBvY2N1ciBib3RoIG1vcmUgYW5kIGxlc3MgZnJlcXVlbnRseSB0aGFuIGV2ZXJ5IG1vbnRoOyB0aGVyZSBpcyBhbHNvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHBhcnRuZXJzIGFyZSBqdXN0IGVsZWN0aW5nICJvdGhlciIgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBjb2x1bW4gYmxhbmsuIEl0IGlzIHBvc3NpYmxlIHRvIGJhY2tmaWxsIHNvbWUgb2YgdGhlICJvdGhlciIgdmFsdWVzIGZyb20gdGhlIGBiZW5lZmljaWFyeV9yZWN1cnJlbmN5YCBjb2x1bW4uIFRoaXMgd2lsbCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBjaGFwdGVyIG9uIGJlbmVmaWNpYXJpZXMuICANCg0KQSBrZXkgcGllY2Ugb2YgbWlzc2luZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGNhcHR1cmVkIGJ5IHRoZSA1VyB0ZW1wbGF0ZSBpcyB0aGUgZHVyYXRpb24gb2YgdGhlc2UgYWN0aXZpdGllcyAtLSB0aGUgbnVtYmVyIG9mIG1vbnRocyBhIG1vbnRobHkgZm9vZCBiYXNrZXQgaXMgcHJvdmlkZWQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBzb21ld2hhdCByZWxpYWJseSB3aXRoIGNvbnNpZGVyYWJsZSBlZmZvcnQuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgYXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiB0aGUgdmFyaW91cyBhY3Rpdml0aWVzIGluIHRoZSBgZnJlcXVlbmN5YCBjYXRlZ29yeSAiTW9udGhseSI6DQoNCmBgYHtyIHRhYmxlLWF2Zy1kdXJhdGlvbi1hY3Rpdml0aWVzfQ0KZnNjICU+JSAgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB0b3duc2hpcCwgbG9jYXRpb24pICU+JQ0KICBzdW1tYXJpc2UocmVjdXJyZW5jZXMgPSBuX2Rpc3RpbmN0KGRhdGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19kdXJhdGlvbl9tb250aHMgPSBtZWFuKHJlY3VycmVuY2VzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYXZnX2R1cmF0aW9uX21vbnRocykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiBtb250aGx5IGFjdGl2aXRpZXMiKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAyLjMgTW9uZXRhcnkgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkDQoNCjxicj4NCg0KYGBge3IgcGxvdC11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbikgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYCVfb2ZfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHVzZF9oaGRfYmluLCB5ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgJV9vZl9iZW5lZmljaWFyaWVzYCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMTYwMDAwLCBieSA9IDIwMDAwKSkgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIGFuZCBwZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgYnkgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIikNCmBgYA0KDQo8YnI+DQoNClRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSBiZXR3ZWVuIFVTRCAxMCBhbmQgVVNEIDIwLCB0aG91Z2ggaXQgc2hvdWxkIGJlIG5vdGVkIC0tIGFuZCBjYW4gYmUgbW9yZSBjbGVhcmx5IHNlZW4gZnJvbSB0aGUgdGFibGUgYmVsb3csIGEgbm90IGluc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgKGFib3V0IDglKSB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBtb3JlIHRoYW4gVVNEIDEwMCBwZXIgaG91c2Vob2xkLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIG1vbmV0YXJ5IHZhbHVlcyB3ZXJlIGNhbGN1bGF0ZWQgb25seSBmcm9tIHJvd3Mgd2l0aCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhhdCB3ZSBhcmUgbm90IHVzaW5nIHRoZSBjdW11bGF0aXZlIHN1bXMgcGVyIGhvdXNlaG9sZC4gDQoNCmBgYHtyIHRhYmxlLXVzZC1oaGQtYmluLWZyZXF1ZW5jeX0NCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgdmFsdWVzIGluIHRoZSBwYXJhZ2FwaCBhYm92ZSBpZiB5b3UgcmVydW4gdGhpcyBvbiBuZXcgZGF0YSANCg0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEodXNkX2hoZF9iaW4pICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JSANCiAgY291bnQodXNkX2hoZF9iaW4sZnJlcXVlbmN5LCB3dCA9IGJlbmVmaWNpYXJpZXMpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZnJlcXVlbmN5LCB2YWx1ZXNfZnJvbSA9IG4pICU+JSANCiAgcmVuYW1lKHRyYW5zZmVyX3ZhbHVlID0gdXNkX2hoZF9iaW4pICU+JQ0KICByZWxvY2F0ZShGaXJzdCwgLmFmdGVyID0gdHJhbnNmZXJfdmFsdWUpICU+JSANCiAgc2VsZWN0KC1gTkFgKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwY19vZl9Ub3RhbCA9IHJvdW5kKFRvdGFsIC8gc3VtKFRvdGFsKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQ2FzaCB0cmFuc2ZlciwgaHlicmlkIGFuZCB2b3VjaGVyIHZhbHVlcyBwZXIgaG91c2Vob2xkIGJ5IGZyZXF1ZW5jeSBvZiB0cmFuc2ZlciAoVVNEKSIpICAgDQpgYGANCg0KPGJyPg0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyIGJhcnBsb3QtZmFjZXQtdXNkLWhoZC1iaW4tYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9oaGRfYmluKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICBsYWJzKHRpdGxlID0gIlZhcmlhdGlvbiBpbiB0aGUgIHBlciBob3VzZWhvbGQgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBpbiBVU0QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKQ0KDQpgYGANCg0KDQpPdmVyYWxsLCB0aGUgaGlnaGVzdCBhdmVyYWdlIGNhc2ggdHJhbnNmZXJzIHdlcmUgZnJvbSBhY3Rpdml0aWVzIHByb3ZpZGluZyBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBjb21pbmcgZnJvbSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIChhZnRlciBkaXNjb3VudGluZyBmb29kIGJhc2tldHMsIHdoZXJlIGxlc3MgdGhhbiAxJSBvZiBhY3Rpdml0aWVzIHJlcG9ydGVkIHRoZSBwYWNrYWdlIHZhbHVlKS4gDQoNCkl0IHdvdWxkIGJlIGZydWl0ZnVsIHRvIGV4cGxvcmUgdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIGluIG1vcmUgZGV0YWlsIC0tIHRoaXMgYWN0aXZpdHkgaGFzIGEgdmVyeSBjbGVhciBwZWFrIGF0IGA+PSQxMF88JDIwYC4gQSBjbG9zZXIgbG9vayByZXZlYWxzIHRoYXQgdGhpcyBpcyBhbG1vc3QgZW50aXJlbHkgZHVlIHRvIHRoZSBgciBmc2MgJT4lIGZpbHRlcih2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA9PSAxMC41ICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBtb250aGx5IHRyYW5zZmVycyBvZiBVU0QgMTAuNTAvbW9udGggKG9yIE1NSyAxNSwwMDApIHBlciBob3VzZWhvbGQuIEl0IGlzIHVuY2xlYXIgd2hldGhlciB0aGlzIGlzIGEgZGF0YSBlbnRyeSBlcnJvciAtLSBidXQgd2hhdCB3ZSBkbyBrbm93IGlzIHRoYXQgdGhlIGhvdXNlaG9sZHMgdGhhdCByZWNlaXZlZCB0aGlzIHR5cGUgb2YgdHJhbnNmZXIgd2VyZSBub3QgYWJub3JtYWxseSBzbWFsbDsgaXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBiZSBwb3NzaWJsZSB0aGF0IHRoaXMgYWN0aXZpdHkgaGFkIGJlZW4gY29uY2VpdmVkIGFzIG9uZSBzaW5ndWxhciB0cmFuc2ZlciB0aGF0IGhhZCBiZWVuIHNwbGl0IGFjcm9zcyBzZXZlcmFsIG1vbnRocy4gDQoNClRoaXMgc2hvdWxkIGJlIGZvbGxvd2VkIHVwIHdpdGggdGhlIDcgcGFydG5lcnMgd2hvIHByb3ZpZGVkIHRoaXMgdHJhbnNmZXIgdmFsdWUgdG8gYmVuZWZpY2lhcnkgaG91c2Vob2xkczsgdGhleSBhcmU6IFNhdmUgdGhlIENoaWxkcmVuLCBXRlAsIE15YW5tYXIgSGVhcnQgT3JnYW5pc2F0aW9uLCBQZW9wbGUgZm9yIFBlb3BsZSwgUGxhbiBJbnRlcm5hdGlvbmFsLCBXb3JsZCBWaXNpb24gTXlhbm1hciBhbmQgS2FydW5hIE1pc3Npb24gU29jaWFsIFNvbGlkYXJpdHkuIA0KDQpJZiBjb3JyZWN0LCB0aGlzIGFtb3VudCBmYWxscyBmYXIgYmVsb3cgdGhlIG1pbmltdW0gZXhwZW5kaXR1cmUgYmFza2V0IGZvciBmb29kIGlkZW50aWZpZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cCwgd2hpY2ggZXN0YWJsaXNoZWQgYSBmbG9vciBvZiBNTUsgMTkwLDU1NSBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gQmVsb3cgaXMgYSB0YWJsZSB3aGljaCBzdW1tYXJpc2VzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBpcyBjb3ZlcmVkIGJ5IHRoZSBkaWZmZXJlbnQgYmlucyB3ZSBoYXZlIGVzdGFibGlzaGVkIGZvciB0aGUgY2FzaC10cmFuc2ZlciB2YWx1ZXM6DQoNCmBgYHtyIHRhYmxlLW1lYi11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIGZpbHRlcighaXMubmEodmFsdWVfcGVyX2hvdXNlaG9sZCkpICU+JSANCiAgbXV0YXRlKHBjX21lYiA9IHZhbHVlX3Blcl9ob3VzZWhvbGQgLyAxOTA1NTUpICU+JSANCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lYW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikNCg0KIyByZW1pbmRlciB0byByZWRvIHZhbHVlcyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggbmV3IGRhdGEgDQogIA0KYGBgDQoNCkFyb3VuZCA5JSBvZiBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgaGF2ZSByZWNlaXZlZCBtb3JlIHRoYW4gNTAlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QuIE5vdGFibHksIDE1JSBvZiBiZW5lZmljaWFyaWVzIGhhdmUgcmVjZWl2ZWQgbGVzcyB0aGFuIFVTRCAxMCBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gVGhpcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBzdGFuZGFyZGlzYXRpb246IGJlbmVmaWNpYXJpZXMgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHZlcnkgZGlmZmVyZW50IHBhY2thZ2UgYW1vdW50cyBhbmQgdGhlcmUgaXMgYSBwcmVzc2luZyBuZWVkIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gb24gd2hldGhlciBjYXNoIHRyYW5zZmVycyAoYW5kIGZvb2QgYmFza2V0cykgaGF2ZSBiZWVuIGRlc2lnbmVkIHRvIGJlIGZ1bGwgcmF0aW9ucyBvciBhcmUgaW5zdGVhZCBpbnRlbmRlZCB0byBiZSBzdXBwbGVtZW50YXJ5IGFjdGl2aXRpZXMuIFRoaXMgaXMga2V5IGZyb20gYSBjb29yZGluYXRpb24gc3RhbmRwb2ludCBhcyB3ZSBjYW5ub3QgY29uc2lkZXIgdGhlIGZvb2Qgc2VjdXJpdHkgbmVlZHMgb2YgdGhvc2Ugd2hvIGhhdmUgb25seSByZWNlaXZlZCBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyB0byBoYXZlIGJlZW4gY292ZXJlZC4NCg0KDQo8YnI+PGJyPg0KDQojIyAzLiBQYXJ0bmVycw0KDQpPZiB0aGUgNTEgcGFydG5lcnMgb2YgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgYSB0b3RhbCBvZiBgciBmc2MgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIG9mIHRoZW0gY2xhc3NpZmllZCB0aGVtc2VsdmVzIGFzIGltcGxlbWVudGluZyBwYXJ0bmVycyB3aXRoaW4gdGhlIDVXcy4gVGhleSBhcmUgZmFpcmx5IGV2ZW5seSBzcGxpdCB0aGVtc2VsdmVzIGJldHdlZW4gSFJQIGluZGljYXRvcnMsIHdpdGggYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMS4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGZvb2QgYW5kIGNhc2ggYXNzaXN0YW5jZSBhbmQgYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMi4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBmaWx0ZXIoYmVuZWZpY2lhcmllcyA8IDEwMDAwKSAlPiUgbnJvdygpYCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSB7bWVkaWFuKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gQmVsb3cgYXJlIHRoZSB0b3AgMTAgcGFydG5lcnMgYnkgSFJQIGluZGljYXRvci4gQXMgYSBzaWRlIG5vdGUsIFppZ3dheSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhIHZlbmRvci9zdXBwbGllciBvZiBXRlAsIGFuZCBub3QgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIC0tIHNvbWUgZm9sbG93IHVwIHdpdGggV0ZQIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHJlY3RpZnkgdGhpcy4NCg0KYGBge3IgdGFibGUtdG9wLXBhcnRuZXJzLWJ5LWhycC1pbmRpY2F0b3J9DQoNCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgbnVtYmVycyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggZnJlc2ggZGF0YSANCg0KY2JpbmQoDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjFgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCksDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0YCA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgIGBQYXJ0bmVycyBIUlAgaW5kaWNhdG9yMmAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKQ0KICANCikgJT4lIA0KICBhZGRfY29sdW1uKGAgYCA9ICIgIikgJT4lIA0KICByZWxvY2F0ZShgIGAsIC5hZnRlciA9IGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IEhSUCBpbmRpY2F0b3IiKQ0KDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xIERpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIGFuZCBnZW9ncmFwaGljIHJlYWNoDQoNCldoaWxzdCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIHdlIGNhbiBzZWUgdGhhdCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSAtLSBvbiB0aGUgd2hvbGUgLS0gcXVpdGUgbGltaXRlZC4gT25seSBgciBiZW4gJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSBmaWx0ZXIodG93bnNoaXBzID4gMTApICU+JSBucm93KClgIHBhcnRuZXJzIGhhdmUgYSBwcmVzZW5jZSBpbiBtb3JlIHRoYW4gMTAgdG93bnNoaXBzLCB3aXRoIG9ubHkgYHIgYmVuICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiA3OSUgb2Ygb3VyIHBhcnRuZXJzIChjbHVzdGVyZWQgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQpIGFyZSBwcmVzZW50IGluIDUgb3IgbGVzcyB0b3duc2hpcHMuIFRoaXMgZGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIGlzIGFuIGltcGVkaW1lbnQgdG8gYSBjb3VudHJ5d2lkZSByZXNwb25zZSBhbmQgaXQgaXMgaW1wZXJhdGl2ZSB0byB1bmRlcnN0YW5kIGhvdyBiZXN0IHRvIGluY2VudGl2aXNlIHBhcnRuZXJzIHRvIGV4cGFuZCB0aGVpciBmb290cHJpbnRzLg0KDQpgYGB7ciBwbG90bHktc2NhdHRlci1wYXJ0bmVycy1yZWFjaH0NCiMgcmVtaW5kZXIgdG8gcmVjYWxjdWxhdGUgdGhlIDc5JSBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIGRhdGEgDQpwYXJ0bmVyX3NjYXR0ZXIgPC0gYmVuICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdGF0ZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIHRleHQgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSArICANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgDQojIGZvciBzb21lIHJlYXNvbiwgcmVtb3ZpbmcgdGhpcyBtZXNzZXMgd2l0aCB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbG90DQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlcikgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjIgTWFwcyBvZiBudW1iZXIgb2YgcGFydG5lcnMgYW5kIDIwMjIgcGVvcGxlIGluIG5lZWQgYnkgc3RhdGUvcmVnaW9uDQoNCg0KYGBge3IgaGFzLXBhcnRuZXItZGF0YXNldH0NCmhhc19wYXJ0bmVyIDwtIHBpbiAlPiUgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIHRvd25zaGlwLCBwaW5fMjAyMikgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSAgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBtdXRhdGUoaGFzX3BhcnRuZXIgPSBpZmVsc2UocGFydG5lcnMgPT0gMCwgRkFMU0UsIFRSVUUpKSAlPiUgDQogIGdyb3VwX2J5KGhhc19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHN1bShwaW5fMjAyMiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuKCkpICU+JSANCiAgYWRvcm5fcGVyY2VudGFnZXMoImNvbCIpICU+JSANCiAgbXV0YXRlKHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgdG93bnNoaXBzID0gcm91bmQodG93bnNoaXBzICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KYGBgDQoNCkZvb2QgU2VjdXJpdHkgQ2x1c3RlciBwYXJ0bmVycyBhcmUgbm90IHdlbGwtcG9zaXRpb25lZCB0byBtZWV0IHRoZSBuZWVkcyBvZiB0aGUgMjAyMiBwb3B1bGF0aW9uIGluIG5lZWQuIFBhcnRuZXJzIGFyZSBsYXJnZWx5IGNvbmNlbnRyYXRlZCBpbiBLYWNoaW4sIFJha2hpbmUgYW5kIFlhbmdvbiwgd2l0aCBubyBwYXJ0bmVycyBwcmVzZW50IGluIFRhbmludGhhcnlpIGFuZCBCYWdvIChXZXN0KSBhbmQgb25seSBvbmUgcGFydG5lciBwcmVzZW50IGluIE1hZ3dheSwgQmFnbyAoRWFzdCkgYW5kIFNoYW4gKEVhc3QpLiBUaGUgbnVtYmVyIG9mIHBhcnRuZXJzIGluIEF5ZXJ5YXdhZHkgaXMgYWxzbyBxdWl0ZSBkaXNwcm9wb3J0aW9uYXRlIHdpdGggdGhlIG51bWJlciBvZiBwZW9wbGUgaW4gbmVlZCBpbiB0aGF0IHJlZ2lvbi4gDQoNCk92ZXJhbGwsIGByIHJvdW5kKGhhc19wYXJ0bmVyICU+JSBmaWx0ZXIoaGFzX3BhcnRuZXIgPT0gRkFMU0UpICU+JSBwdWxsKHRvd25zaGlwcykpYCUgb2YgdG93bnNoaXBzLCBjb250YWluaW5nIGByIHJvdW5kKGhhc19wYXJ0bmVyICU+JSBmaWx0ZXIoaGFzX3BhcnRuZXIgPT0gRkFMU0UpICU+JSBwdWxsKHBpbl8yMDIyKSlgJSBvZiB0aGUgMjAyMiBQSU4sIGRvIG5vdCBoYXZlIGFueSBwYXJ0bmVycyBwcmVzZW50LiBUaGlzIGxhY2sgb2YgbmF0aW9ud2lkZSBjb3ZlcmFnZSB3aWxsIGJlIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgY29uc3RyYWludHMgdGhhdCB0aGUgRlNDIHdpbGwgZmFjZSBpbiBtZWV0aW5nIHRoZSAyMDIyIG5lZWRzIG9mIHZ1bG5lcmFibGUsIGZvb2QgaW5zZWN1cmUgcGVyc29ucyBhbmQgSURQcyAtLSBhbmQgcmVzb2x2aW5nIHRoaXMgd2lsbCBuZWNlc3NpdGF0ZSBpbmNyZWFzaW5nIHBhcnRuZXIgY292ZXJhZ2UgYW5kIGZpbmRpbmcgbmV3IHBhcnRuZXJzIHRoZSBjbHVzdGVyLg0KDQpgYGB7ciBtYXAtcGFydG5lcnMtcGluLXRvd25zaGlwLCBmaWcuaGVpZ2h0PTEwfQ0KIyBwbGF5IHdpdGggZ2VvbV9saW5lIGZvciB0aGUgaW50ZXJhY3RpdmUgcmVmZXJlbmNlIG1hcCAtLSBtYXliZSB5b3UgY2FuIGdldCB0aGUgb3V0bGluZXMgdG8gYmUgaW4gZGlmZmVyZW50IGNvbG91cnMNCg0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gcGFydG5lcnMpLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IGMoMSwgMywgNSwgNywgOSkpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJykpICsNCiAgbGFicyh0aXRsZSA9ICJNYXAgb2YgbnVtYmVyIG9mIHBhcnRuZXJzIGJ5IHRvd25zaGlwIikgKw0KDQpwaW4gJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKFBJTiA9IHN1bShwaW5fMjAyMikpICU+JSANCiAgbXV0YXRlKFBJTiA9IHJvdW5kKFBJTiwgZGlnaXRzID0gMCksIA0KICAgICAgICAgUElOID0gcmVjb2RlKFBJTiwgDQogICAgICAgICAgICAgICAgICAgICAgJzAnID0gTkFfcmVhbF8pKSAlPiUNCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IFBJTiksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICJyZXZlcnNlIiwgYnJlYWtzID0gYygxMDAwMCwgNTAwMDAsIDEwMDAwMCwgMTUwMDAwLCAxODAwMDApKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJykpICsNCiAgbGFicyh0aXRsZSA9ICJNYXAgb2YgMjAyMiBQSU4gYnkgdG93bnNoaXAiKQ0KDQpgYGANCg0KDQoNCiMjIyAzLjMgUmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMNCg0KVGhlcmUgYXJlIGByIGZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpYCBjb21iaW5hdGlvbnMgYmV0d2VlbiByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBhbmQgaW1wbGVtZW50aW5nIHBhcnRuZXJzLCBgciBmc2MgJT4lIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24sIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGZpbHRlcihyZXBvcnRpbmdfb3JnYW5pemF0aW9uID09IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIG5yb3coKWAgb2Ygd2hpY2ggYXJlIGluc3RhbmNlcyB3aGVyZSB0aGUgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiBhbmQgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIGFyZSB0aGUgc2FtZSBvcmdhbmlzYXRpb247IG9uY2UgdGhlc2UgYXJlIGZpbHRlcmVkIG91dCwgYWxsIHRoZSByZW1haW5pbmcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmQgdG8ganVzdCBgciBmc2MgJT4lIGZpbHRlcihyZXBvcnRpbmdfb3JnYW5pemF0aW9uICE9IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSBucm93KClgIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zOg0KDQpgYGB7ciB0YWJsZS1yZXBvcnRpbmctb3JnYW5pc2F0aW9ufQ0KZnNjICU+JSANCiAgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIGdyb3VwX2J5KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICdOdW1iZXIgb2YgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IHJlcG9ydGluZyBvcmdhbmlzYXRpb24nKQ0KICANCmBgYA0KDQpSZWdhcmRpbmcgcXVlc3Rpb25zIG9mIG1lbWJlcnNoaXAsIGl0IHdvdWxkIGJlIHNhZmUgdG8gc2F5IHRoYXQgYWxsIHBhcnRuZXJzIHdobyByZXBvcnRlZCBpbiB0aGUgNVdzIC0tIGJlIHRoZXkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgb3IgaW1wbGVtZW50aW5nIHBhcnRuZXJzIC0tIGluIGFkZGl0aW9uIHRvIHN0cmF0ZWdpYyBwYXJ0bmVycyBhbmQgcGFydG5lcnMgd2hvIGFpZCBpbiBhbmFseXNpcyB3aG8gYXJlIG5vdCByZXByZXNlbnRlZCBpbiB0aGUgNVdzLCBhcmUgRlNDIHBhcnRuZXJzLiBIb3dldmVyLCBmb3IgdGhpcyByZXBvcnQsIHdlIGhhdmUgdXNlZCBgaW1wbGVtZW50aW5nX3BhcnRuZXJzYCBmb3IgbW9zdCBvZiB0aGUgYW5hbHlzaXMgYXMsIGJ5IHRoZWlyIG5hdHVyZSwgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgZG8gbm90IGhhdmUgYSBmaWVsZCBwcmVzZW5jZS4gQXMgYSBzaWRlIG5vdGUsIEZBTyBoYXMgbm90IGNsYXNzaWZpZWQgaXRzZWxmIGFzIGFuIGltcGxlbWVudGluZyBwYXJ0bmVyLCBoYXZpbmcgcmVwb3J0ZWQgbm8gYWN0aXZpdGllcyB0aGF0IHdlcmUgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlbS4gDQoNCjxicj4NCg0KIyMjIDMuNCBUeXBlcyBvZiBwYXJ0bmVycw0KDQpgYGB7ciB0YWJsZS1pbXBsZW1lbnRpbmctcGFydG5lci10eXBlfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWFuKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgYXZnX3Rvd25zaGlwcyA9IG1lYW4odG93bnNoaXBzKSwgDQogICAgICAgICAgICBhdmdfc3RhdGVzID0gbWVhbihzdGF0ZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJBdmVyYWdlIHJlYWNoIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIHR5cGUiKQ0KYGBgDQoNClRoZXJlIGlzIG5vIHJlYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhdmVyYWdlIG51bWJlcnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IElOR09zIGFuZCBOTkdPczsgaG93ZXZlciwgdGhlIGdlb2dyYXBoaWNhbCByZWFjaCBvZiBJTkdPcyBpcyBtYXJrZWRseSBncmVhdGVyLCBwZXJoYXBzIGR1ZSB0byB0aGUgbXVjaCB0aWdodGVyIGdlb2dyYXBoaWNhbCBmb2N1cyBvZiBzZXZlcmFsIGNvbW11bml0eS1iYXNlZCBvcmdhbmlzYXRpb25zLiBUaGVyZSBpcyBvbmx5IG9uZSBhZ2VuY3kgaW4gdGhlICJVTiIgY2F0ZWdvcnkgZm9yIGltcGxlbWVudGluZyBwYXJ0bmVyIHR5cGUgLS0gV0ZQLg0KDQpUaGUgb25seSBub3RhYmxlIHRoaW5nIGFib3V0IHRoZSBgZG9ub3JgIGNvbHVtbiBpcyBpdHMgaW5jb21wbGV0ZW5lc3MsIHdoaWNoIGlzIHVuZGVyc3RhbmRhYmxlIC0tIG9ubHkgYHIgcm91bmQoc3VtKCghaXMubmEoZnNjJGRvbm9yKSkpIC8gbnJvdyhmc2MpICogMTAwLCBkaWdpdHMgPSAwKWAlIChyZXByZXNlbnRpbmcgb25seSAxMCUgb2YgYWxsIHJlcG9ydGVkIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzKSBvZiB0aGUgcm93cyBhcmUgZmlsbGVkLiBBZGRpdGlvbmFsbHksIHdlIGFsc28gb2JzZXJ2ZSBhIG51bWJlciBvZiBlcnJvcnMsIGluY2x1ZGluZyBjYXNlcyB3aGVyZSBtdWx0aXBsZSBkb25vcnMgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gb25lIHJvdyBhcyB3ZWxsIGFzIG51bWVyb3VzIGluc3RhbmNlcyB3aGVyZSBXRlAsIEZBTyBhbmQgVU4gV09NRU4gd2VyZSBjbGFzc2lmaWVkIGFzIGRvbm9ycyBhcyBvcHBvc2VkIHRvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLiBOb3QgbXVjaCB1c2VmdWwgYW5hbHlzaXMgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoaXMgY29sdW1uIGF0IHByZXNlbnQuDQoNCjxicj48YnI+DQoNCiMjIDQuIEJlbmVmaWNpYXJpZXMNCg0KIyMjIDQuMSBCZW5lZmljaWFyeSBkaXNhZ2dyZWdhdGlvbnMNCg0KQ3VycmVudGx5LCBpbiB0aGUgNVdzLCB0aGUgdmFzdCBtYWpvcml0eSBvZiBiZW5lZmljaWFyeSBkaWFzYWdncmVnYXRpb25zIGhhdmUgYmVlbiBiYWNrZmlsbGVkIGZyb20gY2Vuc3VzIGRhdGEgYW5kIGRvIG5vdCwgY29uc2VxdWVudGx5LCBwcm92aWRlIGFuIGFjY3VyYXRlIHBpY3R1cmUgb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBoYXZlIGJlZW4gcmVhY2hlZCBidSBGb29kIFNlY3VyaXR5IGludGVydmVudGlvbnMuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IGZhciByZWFsaXR5IGRpdmVyZ2VzIGZyb20gd2hhdCBoYXMgYmVlbiByZXBvcnRlZCBzbyBmYXIgLS0gbWVhbmluZyB0aGF0IHdlIGFsc28gY2Fubm90IGRldGVybWluZSBpZiB0aGVyZSBoYXMgYmVlbiBhbnkgYmlhcyBpbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24gYW5kIHRhcmdldHRpbmcuIEl0IGlzIGltcGVyYXRpdmUgdG8gYmVnaW4gY29sbGVjdGluZyBkaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGRhdGEgZnJvbSBwYXJ0bmVycy4gDQoNCkl0IGlzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgcGFydG5lcnMgYXJlIGNvbGxlY3RpbmcgdGhpcyBkYXRhIC0tIGRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YSBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIGRhdGEgcmVxdWlyZWQgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCByZXBvcnRpbmcgLS0gYW5kIHRoYXQgaXQgaXMgbWVyZWx5IG5lY2Vzc2FyeSB0byB3b3JrIHdpdGggcGFydG5lcnMgdG8gd3JhbmdsZSB0aGVpciBkYXRhIGludG8gdGhlIDVXIGZvcm1hdC4gSG93ZXZlciwgdGhlIGNhcGFjaXRpZXMgb2YgcGFydG5lcnMgdG8gZGlzYWdncmVnYXRlIGJlbmVmaWNpYXJ5IGRhdGEgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBieSB0aGUgY2x1c3RlciBhbmQgaXMgYW4gaW1wb3J0YW50IGlzc3VlcyB0aGF0IHNob3VsZCBiZSBicm91Z2h0IHVwIGluIHRlIG5leHQgcGxlbmFyeSBzZXNzaW9uLiANCg0KPGJyPg0KDQojIyMgNC4yIFR5cGVzIG9mIGJlbmVmaWNpYXJpZXMNCg0KYGBge3IgYmVuZWZpY2lhcnktdHlwZS1kYXRhc2V0fQ0KYmVuX3R5cGUgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBhZG9ybl9wZXJjZW50YWdlcyhkZW5vbWluYXRvciA9ICJjb2wiLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJpZXMgPSByb3VuZChiZW5lZmljaWFyaWVzICogMTAwLCBkaWdpdHMgPSAyKSkNCmBgYA0KDQoNClRoZSBzdGF0ZXMgYW5kIHN1Yi1yZWdpb25zIGluIHdoaWNoIHdlIGFyZSB3b3JraW5nIHRoZSBtb3N0IHdpdGggSURQcyBhcmUgQmFnbyAoRWFzdCksIEthY2hpbiwgQ2hpbiwgU2hhbiAoTm9ydGgpIGFuZCBLYXlhaC4gT3ZlcmFsbCwgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgb2YgYmVuZWZpY2lhcmllcyBhcmUgZnJvbSB0aGUgaG9zdC9sb2NhbCBjb21tdW5pdHksIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiUmFraGluZSBzdGF0ZWxlc3MiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBzdGF0ZWxlc3MgcGVyc29ucyBmcm9tIFJha2hpbmUgYW5kIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBJRFBzLiBSZXR1cm5lZXMgYXJlIHRoZSByYXJlc3QgdHlwZSBvZiBiZW5lZmljaWFyeSByZWFjaGVkLCBmb3JtaW5nIG9ubHkgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJSZXR1cm5lZXMiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIEVhY2ggcm93IGluIHRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgcGVyY2VudGFnZSBvZiBlYWNoIGJlbmVmaWNpYXJ5IHR5cGUgd2l0aGluIGVhY2ggc3RhdGUvcmVnaW9uLiANCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcnktdHlwZXMtc3RhdGV9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBiZW5lZmljaWFyeV90eXBlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYWRvcm5fdG90YWxzKHdoZXJlID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcyhkZW5vbWluYXRvciA9ICJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYEhvc3QvbG9jYWwgQ29tbXVuaXR5YCwgYEludGVybmFsbHkgRGlzcGxhY2VkYCwgYFJldHVybmVlc2AsIGBSYWtoaW5lIHN0YXRlbGVzc2ApLCANCiAgICAgICAgICAgIC5mdW5zID0gbGlzdCh+IHJvdW5kKC4gKiAxMDAsIGRpZ2l0cyA9IDIpKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYEhvc3QvbG9jYWwgQ29tbXVuaXR5YCA9IDAsIGBJbnRlcm5hbGx5IERpc3BsYWNlZGAgPSAwLCBgUmV0dXJuZWVzYCA9IDAsIGBSYWtoaW5lIHN0YXRlbGVzc2AgPSAwKSkgJT4lICANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KHN0YXRlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJzdGF0ZSIpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyeSB0eXBlcyBieSBzdGF0ZS9yZWdpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQ0KDQpgYGANCg0KPGJyPg0KDQpDb21wYXJlZCB0byBvbmx5IHRoZSAyMDIxIEhSUCB0YXJnZXRzIChhcyB0aGUgSUVSUCBkb2VzIG5vdCBoYXZlIGJyZWFrZG93bnMgb2YgdGhlIHRhcmdldCBieSBiZW5lZmljaWFyeSB0eXBlKSwgd2UgY2FuIHNlZSB0aGF0IHdoaWxzdCB0YXJnZXRzIGhhdmUgYmVlbiBtb3N0bHkgZXhjZWVkZWQsIG5laXRoZXIgdGhlIHRhcmdldHMgZm9yIHJldHVybmVlcy9yZXNldHRsZWQgaW4gS2FjaGluIG9yIFNoYW4gKE5vcnRoKSBub3IgdGFyZ2V0cyBmb3IgSURQcyBpbiBSYWtoaW5lIG9yIEtheWluIGhhdmUgYmVlbiBtZXQuIEludGVyZXN0aW5nbHksIGZvciBSYWtoaW5lLCB0aGUgdGFyZ2V0cyBmb3IgdGhlIGhvc3QvbG9jYWwgcG9wdWxhdGlvbiBoYXZlIGJlZW4gZ3JlYXRseSBleGNlZWRlZC4gSW4gQmFnbyAoRWFzdCksIENoaW4sIGFuZCBwYXJ0aWN1bGFybHkgU2hhbiAoTm9ydGgpLCB0aGUgdGFyZ2V0cyBmb3IgSURQcyBoYXZlIGJlZW4gZ3JlYXRseSBleGNlZWRlZCwgaW4gY29tcGFyaXNvbiB0byB0aGUgMjAyMSBIUlAgdGFyZ2V0czoNCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcnktdHlwZS1yZWFjaGVkLWhycC10YXJnZXR9DQojIHJlbWluZGVyIHRvIGNoZWNrIHRoZSB0ZXh0IGluIHRoZSBwYXJhZ3JhcGggYWJvdmUgd2hlbiB5b3UgcmVydW4gdGhlIHJlcG9ydCB3aXRoIGRhdGENCnBpbiAlPiUNCiAgZmlsdGVyKGhycF90YXJnZXRfdG90YWwgPiAwKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgYWRtaW4zX3Bjb2RlLCBocnBfdGFyZ2V0X2lkcHNfMjAyMSwgaHJwX3RhcmdldF9yZXR1cm5lZXNfMjAyMSwgaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxLCANCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfb3RoZXJfdnVsbmVyYWJsZV8yMDIxLCBocnBfdGFyZ2V0X3RvdGFsKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBiZW5lZmljaWFyeV90eXBlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgbXV0YXRlKHRvdGFsX2JlbmVmaWNpYXJpZXMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMoaHJwX3RhcmdldF9pZHBzXzIwMjE6dG90YWxfYmVuZWZpY2lhcmllcyksIH5zdW0oLikpICU+JSANCiAgbXV0YXRlKGhvc3RfbG9jYWxfcGMgPSBob3N0X2xvY2FsX2NvbW11bml0eSAvIGhycF90YXJnZXRfb3RoZXJfdnVsbmVyYWJsZV8yMDIxICogMTAwLCANCiAgICAgICAgIGlkcF9wYyA9IGludGVybmFsbHlfZGlzcGxhY2VkIC8gaHJwX3RhcmdldF9pZHBzXzIwMjEgKiAxMDAsDQogICAgICAgICByZXR1cm5lZXNfcGMgPSByZXR1cm5lZXMgLyBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxICogMTAwLA0KICAgICAgICAgcmFraGluZV9zdGF0ZWxlc3NfcGMgPSByYWtoaW5lX3N0YXRlbGVzcyAvIGhycF90YXJnZXRfc3RhdGVsZXNzX3Jha2hpbmVfMjAyMSAqIDEwMCwNCiAgICAgICAgIHRvdGFsX3BjID0gdG90YWxfYmVuZWZpY2lhcmllcyAvIGhycF90YXJnZXRfdG90YWwgKiAxMDApICU+JSANCiAgc2VsZWN0KHN0YXRlLCBob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcmVwbGFjZSguLCBpcy5uYW4oLiksIE5BKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpLCB+IHJlcGxhY2UoLiwgaXMuaW5maW5pdGUoLiksIE5BKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpLCB+IHJvdW5kKC4sIGRpZ2l0cyA9IDIpKSAlPiUNCiAgcmVuYW1lKGBob3N0X2xvY2FsJWAgPSBob3N0X2xvY2FsX3BjLA0KICAgICAgICAgYGlkcCVgID0gaWRwX3BjLA0KICAgICAgICAgYHJldHVybmVlcyVgID0gcmV0dXJuZWVzX3BjLA0KICAgICAgICAgYHJha2hpbmVfc3RhdGVsZXNzJWAgPSByYWtoaW5lX3N0YXRlbGVzc19wYywNCiAgICAgICAgIGB0b3RhbCVgID0gdG90YWxfcGMpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiUGVyY2VudGFnZSBvZiAyMDIxIEhSUCB0YXJnZXQgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlIikNCg0KICANCmBgYA0KIA0KPGJyPg0KDQpTdGF0ZWxlc3MgcGVyc29ucyBmcm9tIFJha2hpbmUgaGF2ZSB0aGUgbGFyZ2VzdCBhdmVyYWdlIGhvdXNlaG9sZCBzaXplcywgYW5kIHRoZSBsYXJnZXN0IHZhcmlhdGlvbnMgaW4gaG91c2Vob2xkIHNpemUuIFRoZSB0aGljayBiYXIgaW4gdGhlIG1pZGRsZSBvZiBlYWNoIGJveCBzaG93cyB0aGUgYXZlcmFnZSBob3VzZWhvbGQgc2l6ZSBmb3IgZWFjaCBiZW5lZmljaWFyeSB0eXBlIC0tIHRoaXMgdmFsdWUgaXMgYWxzbyBzaG93biBpbiB0aGUgdGV4dCBsYWJlbCBiZWxvdyB0aGUgbGluZS4gVGhlIGxvd2VyIGFuZCB1cHBlciBib3JkZXJzIG9mIGVhY2ggYm94IGluZGljYXRlIHRoZSB2YWx1ZXMgZm9yIHRoZSAyNXRoIGFuZCA3NXRoIHBlcmNlbnRpbGVzIHJlc3BlY3RpdmVseS4gRm9yIGluc3RhbmNlLCB3ZSBjYW4gc2VlIHRoYXQgaG91c2Vob2xkcyBhdCB0aGUgMjV0aCBwZXJjZW50aWxlIG9mIGhvdXNlaG9sZHMgaW4gaG9zdC9sb2NhbCBjb21tdW5pdGllcyBoYXZlIG9ubHkgb25lIG1lbWJlciBhbmQgaG91c2Vob2xkcyB0aGF0IGhhdmUgYXJvdW5kIDUgbWVtYmVycyBoYXZlIG1vcmUgbWVtYmVycyB0aGFuIDc1JSBvZiBhbGwgdGhlIGhvdXNlaG9sZHMgaW4gdGhhdCBncm91cC4gT3V0bGllcnMgYXJlIG1hcmtlZCBieSBkb3RzLiBXZSBub3RlIGEgbG90IG9mIHBvdGVudGlhbCBkYXRhIGVudHJ5IGVycm9ycyB3aGVyZSBsZXNzIHRoYW4gb25lIHBlcnNvbiBwZXIgaG91c2Vob2xkIGhhdmUgYmVlbiByZWNvcmRlZC4gDQoNCjxicj4NCg0KYGBge3IgYm94cGxvdC1ob3VzZWhvbGQtc2l6ZS1iZW5lZmljaWFyeS10eXBlfQ0KDQojIHRoaXMgaXMgZm9yIHRoZSBsYWJlbHMgZm9yIHRoZSBib3hwbG90DQpoaGRfbGFicyA8LSBmc2MgJT4lICANCiAgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgIT0gIk5BIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZF9zaXplID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGhvdXNlaG9sZHMsIGRpZ2l0cyA9IDIpKSAgDQogDQoNCiMgZm9yIHNvbWUgcmVhc29uLCB0aGUgbXV0YXRlIGZjdF9yZW9yZGVyIGlzIG5vdCB3b3JraW5nDQojIHlvdSBmaWd1cmVkIHRoaXMgb3V0IGJ1dCBoYXZlIG5lZ2xlY3RlZCB0byB3cml0ZSB0aGUgYW5zd2VyIGhlcmUgDQogDQpmc2MgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSAhPSAiTkEiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgbXV0YXRlKGF2Z19oaGRfc2l6ZSA9IGJlbmVmaWNpYXJpZXMgLyBob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYXZnX2hoZF9zaXplKSwgeSA9IGF2Z19oaGRfc2l6ZSkpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBoaGRfbGFicywgYWVzKGxhYmVsID0gYXZnX2hoZF9zaXplKSwgc2l6ZSA9IDIuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDE0LCAyKSwgbGltaXRzID0gYygwLDE0KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJBdmVyYWdlIGhvdXNlaG9sZCBzaXplIiwNCiAgICAgICB0aXRsZSA9ICJBdmVyYWdlIGhvdXNlaG9sZCBzaXplIGJ5IGJlbmVmaWNpYXJ5IHR5cGVzIikNCg0KYGBgDQoNCg0KPGJyPg0KDQojIyMgNC4zIEJlbmVmaWNpYXJpZXMgYnkgYWN0aXZpdHkgZnJlcXVlbmN5DQoNClRoZSBjYXRlZ29yaWVzICJGaXJzdCIgYW5kICJNb250aGx5IiBpbiB0aGUgZnJlcXVlbmN5IGNvbHVtbiBkbyBub3Qgc2VlbSB0byBiZSBmaWxsZWQgYXMgaW50ZW5kZWQsIGFzIGNhbiBiZSBzZWVuIGZyb20gdGhlIHBsb3QgYmVsb3c6DQoNCjxicj4NCg0KYGBge3IgbGluZS1wbG90LWZpcnN0LW1vbnRobHl9DQoNCmZzYyAlPiUgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIkZpcnN0IiB8IGZyZXF1ZW5jeSA9PSAiTW9udGhseSIpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgZnJlcXVlbmN5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBmcmVxdWVuY3kpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiQmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGZyZXF1ZW5jeSAtLSBjb21wYXJpc29uIGJldHdlZW4gJ0ZpcnN0JyBhbmQgJ01vbnRobHknIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCmBgYA0KDQpUaGUgYXNzdW1wdGlvbiBmb3IgdGhlc2UgY2F0ZWdvcmllcyBpcyB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIGJlbmVmaWNpYXJ5IHJlY2VpdmluZyBzdXBwb3J0IChhcyBwYXJ0IG9mIGEgY29udGludWluZyBtb250aGx5IHN1cHBvcnQgcGFja2FnZSkgd291bGQgZmFsbCB1bmRlciB0aGUgY2F0ZWdvcnkgIkZpcnN0IiBhbmQgZXZlcnkgc3Vic2VxdWVudCB0aW1lIHRoZXkgcmVjZWl2ZWQgc3VwcG9ydCwgaXQgd291bGQgYmUgdW5kZXIgIk1vbnRobHkiLiANCg0KQnV0IHdlIGNhbiBzZWUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgY2FzZSAtLSBtb250aGx5IGJlbmVmaWNpYXJpZXMgcHJlZGF0ZWQgdGhlIHVzZSBvZiB0aGUgIkZpcnN0IiBjYXRlZ29yeSBieSBhdCBsZWFzdCBmb3VyIG1vbnRoczsgZnVydGhlcm1vcmUsIHRoZSBzcGlrZSBpbiBmaXJzdC10aW1lIGJlbmVmaWNpYXJpZXMgaW4gTWF5IDIwMjEgd2FzIG5vdCBhY2NvbXBhbmllZCBieSBhbnkgaW5jcmVhc2UgaW4gbW9udGhseSBiZW5lZmljaWFyaWVzIGluIHRoZSBzdWJzZXF1ZW50IG1vbnRocyAtLSBpbiBmYWN0LCB0aGVyZSB3YXMgYSBkZWNsaW5lIGluIG1vbnRobHkgYmVuZWZpY2lhcmllcy4gQ29tcGxpY2F0aW5nIGFsbCB0aGlzIGlzIHRoYXQgd2UgYXJlIG5vdCBzdXJlIHdoaWNoIG9mIHRoZSBiZW5lZmljaWFyaWVzIHRyYWNrIGJlbmVmaWNpYXJpZXMgaW4gYSBjb21wcmVoZW5zaXZlIG1hbm5lciBpLmUuIHdpdGggYSBiZW5lZmljaWFyeSBkYXRhYmFzZSBhbmQgYmVuZWZpY2lhcnkgSUQgY2FyZHMuIEFsbCB0aGlzIGluZGljYXRlcyB0aGF0IC0tIGFmdGVyIGNvbmZpcm1pbmcgdGhpcyB3aXRoIHBhcnRuZXJzIC0tIHdlIHNob3VsZCBhYmFuZG9uIHRoZSAiRmlyc3QiIGNhdGVnb3J5IGFuZCByZWNvZGUgdGhlc2UgZW50cmllcyBhcyAiT25lLW9mZiIuDQoNCg0KPGJyPg0KDQojIyMgNC40IEdhcHMgaW4gbW9udGhseSBwcm9ncmFtbWluZw0KDQpgYGB7ciB0YWJsZS1nYXBzLW1vbnRoc30NCiMgSSBmZWVsIGxpa2UgdGhpcyBpcyB0aGUgbW9zdCBpbmVmZmljaWVudCB3YXkgdG8gZG8gdGhpczsgc3RpbGwgd29ya3MsIHRob3VnaCANCiMgeW91J3JlIGdvaW5nIHRvIG5lZWQgdG8gcmV3cml0ZSB0aGlzIHdoZW4geW91IGhhdmUgUTQgZGF0YSANCmdhcF9tb250aHMgPC0gZnNjICU+JSANCiAgZmlsdGVyKGZyZXF1ZW5jeSA9PSAiTW9udGhseSIgJiBiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBncm91cF9ieShkYXRlLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGFjdGl2aXR5LCBzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkYXRlLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgdW5uZXN0KCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUocmVjdXJyZW5jZXMgPSByb3dTdW1zKCFpcy5uYShzZWxlY3QoLiwgLWltcGxlbWVudGluZ19wYXJ0bmVycywgLWFjdGl2aXR5LCAtc3RhdGUsIC10b3duc2hpcCwgLWxvY2F0aW9uKSkpLA0KICAgICAgICAgYmVuX21heCA9IHBtYXgoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWAsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWApLCBuYW1lc190byA9ICJkYXRlIiwgdmFsdWVzX3RvID0gImJlbmVmaWNpYXJpZXMiKSAlPiUgDQogIG11dGF0ZShkaXN0cmlidXRpb24gPSBpZmVsc2UoaXMubmEoYmVuZWZpY2lhcmllcyksICJuIiwgInkiKSkgJT4lIA0KICBzZWxlY3QoLWJlbmVmaWNpYXJpZXMpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gZGlzdHJpYnV0aW9uKSAlPiUgDQogIG11dGF0ZShnYXBzID0gcGFzdGUwKGAyMDIxLTAxLTAxYCwgYDIwMjEtMDItMDFgLCBgMjAyMS0wMy0wMWAsIGAyMDIxLTA0LTAxYCwgYDIwMjEtMDUtMDFgLCBgMjAyMS0wNi0wMWAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjAyMS0wNy0wMWAsIGAyMDIxLTA4LTAxYCwgYDIwMjEtMDktMDFgKSkgJT4lIA0KICBtdXRhdGUoZ2FwX21vbnRocyA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ueSIpIH4gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ueSIpIH4gNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm55IikgfiA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ueSIpIH4gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ueSIpIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW55IikgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpIA0KDQojIyBjb21tZW50ZWQgb3V0LCBidXQgdGhpcyB3YXMganVzdCB0byBnZXQgdGhlIG51bWJlciBvZiB0b3duc2hpcHMgd2l0aCBnYXBzIHBlciBzdGF0ZQ0KIyBnYXBfbW9udGhzICU+JSANCiMgICBmaWx0ZXIocmVjdXJyZW5jZXMgPiAxKSAlPiUgDQojICAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwKSAlPiUgDQojICAgc3VtbWFyaXNlKGF2Z19nYXAgPSBtZWFuKGdhcF9tb250aHMpLCANCiMgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhhdmdfZ2FwKSkgJT4lDQojICAgZmlsdGVyKGF2Z19nYXAgPiAwKSAlPiUgDQojICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KIyAgIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSkNCg0KZ2FwX21vbnRocyAlPiUgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDEpICU+JSANCiAgZ3JvdXBfYnkoZ2FwX21vbnRocykgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuX21heCkpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFuZCBsb2NhdGlvbnMgYnkgZHVyYXRpb24gb2YgZ2FwcyBpbiBpbXBsZW1lbnRhdGlvbiIpDQoNCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHBhcmFncmFwaCBiZWxvdyB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0DQoNCmBgYA0KDQo3NSUgb2YgYmVuZWZpY2lhcmllcyBleHBlcmllbmNlZCBubyBnYXBzIGluIG1vbnRobHkgcHJvZ3JhbW1pbmcgYW5kIHZlcnkgbG9uZyBnYXBzIG9mIDQgb3IgNSBtb250aHMgYXJlIHF1aXRlIHJhcmU7IG9mIHRoZSBiZW5lZmljaWFyaWVzIHdobyBkaWQgZXhwZXJpZW5jZSBnYXBzIGluIG1vbnRobHkgY292ZXJhZ2UsIG1vc3QgZXhwZXJpZW5jZWQgZ2FwcyBvZiAxLTIgbW9udGhzLiBUaGUgMTAgdG93bnNoaXBzIHdoaWNoIGV4cGVyaWVuY2VkIHRoZSBsb25nZXN0IGF2ZXJhZ2UgZ2FwcyBiZXR3ZWVuICJtb250aGx5IiBhY3Rpdml0aWVzIHdlcmU6IE1vaG55aW4sIE15aXRreWluYSwgSHBha2FudCwgTW9nYXVuZywgQ2hpcHdpIGFuZCBXYWluZ21hdyBpbiBLYWNoaW47IFNod2VweWl0aGFyIGluIFlhbmdvbjsgRGVtb3NvIGFuZCBMb2lrYXcgaW4gS2F5YWg7IGFuZCBLdXRrYWkgaW4gU2hhbi4gT3ZlcmFsbCwgMTIgdG93bnNoaXBzIGluIEthY2hpbiBleHBlcmllbmNlZCBnYXBzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBtb250aGx5IGFjdGl2aXRpZXM7IDYgaW4gUmFraGluZTsgMiBlYWNoIGluIEF5ZXlhcndhZHksIEtheWFoIGFuZCBTaGFuOyBhbmQgMSBpbiBZYW5nb24uIEl0IHNob3VsZCBiZSBleHBsb3JlZCB3aGV0aGVyIHRoZSBkZWxheXMgaW4gdGhlc2UgYXJlYXMgd2VyZSBkdWUgdG8gYWNjZXNzIGlzc3VlcyBvciBvdGhlciBvdGhlciBjb25zdHJhaW50cy4gDQoNClRoZXJlIGFyZSAxNjcgZW50cmllcyBjb2RlZCBhcyBiZWluZyBpbXBsZW1lbnRlZCBvbiBhIG1vbnRobHkgYmFzaXMgdGhhdCBoYXZlIG5vdCByZWN1cnJlZCAtLSB0aGF0IGlzLCB0aGV5IGhhdmUgb25seSBiZWVuIGltcGxlbWVudGVkIG9uY2U6IHdlIHNob3VsZCBjaGVjayB3aXRoIHBhcnRuZXJzIGlmIHRoZXNlIGFyZSBtZXJlbHkgdGhlIGZpcnN0IGluc3RhbmNlcyBvciBpZiB0aGV5IGFyZSBlcnJvcnMgaW4gZGF0YSBlbnRyeSBvciBpZiB0aGVyZSBoYXZlIGJlZW4gaXNzdWVzIHdpdGggYWNjZXNzLCBzZWN1cml0eSBvciBmdW5kaW5nLiANCg0KPGJyPg0KDQojIyMgNC41IFBvdGVudGlhbCBmb3IgcG9zdC1kaXN0cmlidXRpb24gbW9uaXRvcmluZw0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgYWN0aXZpdGllcyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgZm9yIDYgbW9udGhzIG9yIG1vcmUsIHRoZSBudW1iZXIgb2YgbG9jYXRpb25zIHRoZXkgd2VyZSBpbXBsZW1lbnRlZCBpbiBhbmQgdGhlIG51bWJlciBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFjdGl2aXRpZXMgbWVldGluZyB0aGVzZSBjcml0ZXJpYS4gVGhlIHBvc3NpYmlsaXR5IG9mIGpvaW50IG1vbml0b3JpbmcgLS0gb3IgYXQgbGVhc3QgdGhlIGpvaW50IHJldmlldyBhbmQgYW5hbHlzaXMgb2YgbW9uaXRvcmluZyBkYXRhIC0tIHdpbGwgYmUgZXhwbG9yZWQsIGluIGNvbnN1bHRhdGlvbiB3aXRoIHRoZXNlIHBhcnRuZXJzLiBUaGUgcmF0aW9uYWxlIGJlaW5nIHRoYXQgNiBtb250aHMgb2YgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGEgbG9uZyBlbm91Z2ggcGVyaW9kIG9mIHRpbWUgdG8gbWFrZSBpbXBhY3QgbW9uaXRvcmluZyBmZWFzaWJsZTsgYWRkaXRpb25hbGx5LCBqb2ludCBtb25pdG9yaW5nIHdpbGwgYmUgZnVydGhlciBmYWNpbGl0YXRlZCBieSB0aGUgc2ltaWxhcml0eSBvZiB0aGVzZSBhY3Rpdml0aWVzLCBhbG1vc3QgYWxsIG9mIHdoaWNoIGFyZSByZWN1cnJlbnQgY2FzaCB0cmFuc2ZlcnMgb3IgZGlzdHJpYnV0aW9ucyBvZiBmb29kIGJhc2tldHMuIA0KDQoNCmBgYHtyIHRhYmxlLW1vbnRobHktYWN0aXZpdGllcy02LTktbW9udGhzLCB3YXJuaW5nPUZBTFNFfQ0KIyB5b3UncmUgZ29pbmcgdG8gbmVlZCB0byByZXdyaXRlIHRoaXMgd2hlbiB5b3UgZ2V0IGh0ZSBRNCBkYXRhDQpmc2MgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJNb250aGx5IiAmIGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHNlbGVjdChkYXRlLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGFjdGl2aXR5LCB0b3duc2hpcCwgbG9jYXRpb24sIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICB1bm5lc3QoKSAlPiUgDQogIG11dGF0ZShyZWN1cnJlbmNlcyA9IHJvd1N1bXMoIWlzLm5hKHNlbGVjdCguLCAtaW1wbGVtZW50aW5nX3BhcnRuZXJzLCAtYWN0aXZpdHksIC10b3duc2hpcCwgLWxvY2F0aW9uKSkpLA0KICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHBtYXgoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWAsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHJlY3VycmVuY2VzID4gNSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBuKCksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJOdW1iZXIgb2YgdW5pcXVlIGJlbmVmaWNpYXJpZXMgd2hpY2ggaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA2IG1vbnRocyBvZiByZWN1cnJlbnQgZm9vZCBzZWN1cml0eSBzdXBwb3J0IikNCg0KYGBgDQoNCg0KDQpUaGUgcGFydG5lcnMgd2hpY2ggaGF2ZSBpbXBsZW1lbnRlZCBhY3Rpdml0aWVzIGZpdHRpbmcgdGhlc2UgY3JpdGVyaWEgYXJlIFdGUCwgS2FydW5hIE1pc3Npb24gU29jaWFsIFNvbGlkYXJpdHksIFdvcmxkIFZpc2lvbiBNeWFubWFyLCBNeWFubWFyIE9wZW4gSGVhcnQgRGV2ZWxvcG1lbnQgT3JnYW5pc2F0aW9uLCBQZW9wbGUgZm9yIFBlb3BsZSBhbmQgUGxhbiBJbnRlcm5hdGlvbmFsIGZvciBtb250aGx5IGNhc2ggdHJhbnNmZXJzOyBXb3JsZCBWaXNpb24gTXlhbm1hciwgTXlhbm1hciBPcGVuIEhlYXJ0IERldmVsb3BtZW50IE9yZ2FuaXNhdGlvbiwgQWN0aW9uIGZvciBHcmVlbiBFYXJ0aCwgUGVvcGxlIEhvcGUgQ29tbXVuaXR5IERldmVsb3BtZW50IChQSENEKSwgVG9nZXRoZXIgZm9yIFN1c3RhaW5hYmxlIERldmVsb3BtZW50LCBLYXJ1bmEgTWlzc2lvbiBTb2NpYWwgU29saWRhcml0eSBhbmQgV0ZQIGZvciBtb250aGx5IGZvb2QgYmFza2V0czsgYW5kIHRoZSBEYS1OdSBOYXRpb25hbCBBZmZhaXJzIE9yZ2FuaXNhdGlvbiAoRE5BTykgZm9yIHRlY2huaWNhbCB0cmFpbmluZy4gDQoNCg0KDQo8YnI+PGJyPg0KDQojIyA1LiBOZXh0IHN0ZXBzDQoNCjEuICBDb21tdW5pY2F0ZSB0byBwYXJ0bmVycyB0aGF0IFlhbmdvbiBpcyBzZXZlcmVseSBvdmVyc3Vic2NyaWJlZCBpbiBjb21wYXJpc29uIHRvIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5LCBhYm92ZSBhbGwgaW4gdGhlIHRvd25zaGlwcyBvZiBIbGFpbmd0aGFyeWEsIERhZ29uIE15b3RoaXQgKFNlaWtrYW4pLCBhbmQgRGFsYS4NCg0KMi4gIENvbGxlY3QgZXhpc3RpbmcgaW50ZXJ2ZW50aW9uIHBhY2thZ2VzIGZyb20gcGFydG5lcnMgaW4gb3JkZXIgdG8gYmVnaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhbmRhcmRpc2F0aW9uIGFuZCB0byBzdXBwb3J0IHRoZSByZXZpZXcgb2YgZm9vZCBiYXNrZXRzIGZvciB0aGVpciBjYWxvcmljIGFuZCBudXRyaXRpb25hbCB2YWx1ZS4gUGVyZm9ybSBhZGRpdGlvbmFsIGFuYWx5c2lzIHRvIHVuZGVyc3RhbmQgaWYgYmVuZWZpY2lhcmllcyBpbiBjbG9zZSBwcm94aW1pdHkgdG8gZWFjaCBvdGhlciBoYXZlIHJlY2VpdmVkIHdpZGVseSBkaXZlcmdlbnQgcGFja2FnZSB2YWx1ZXMuIEFkZGl0aW9uYWxseSwgc3BlYWsgd2l0aCBwYXJ0bmVycyB0byB1bmRlcnN0YW5kIHdoeSBjYXNoIHRyYW5zZmVyIHZhbHVlcyB2YXJ5IGJ5IHNvIG11Y2ggZXZlbiB3aXRoaW4gdGhlIHNhbWUgYWN0aXZpdHkgaW1wbGVtZW50ZWQgYnkgdGhlIHNhbWUgcGFydG5lci4gDQoNCjMuIFJldmlzaXQgYXJlYXMgd2hpY2ggaGF2ZSBvbmx5IHJlY2VpdmVkIHNtYWxsZXIgc3VwcGxlbWVudGFyeSB0cmFuc2ZlcnMgLS0gYSB0cmFuc2ZlciBvZiBhcm91bmQgVVNEIDEwIHBlciBob3VzZWhvbGQgcGVyIG1vbnRoIGNhbm5vdCBiZSBjb25zaWRlcmVkIHRvIGhhdmUgY292ZXJlZCB0aGUgZm9vZCBzZWN1cml0eSBuZWVkcyBmb3IgdGhhdCBhcmVhIC0tIG90aGVyIHBhcnRuZXJzIG1heSBiZSBuZWNlc3NhcnkgdG8gY292ZXIgdGhlIGdhcC4gDQoNCjQuIEFkdm9jYXRlIGZvciB0aGUgZXhwYW5zaW9uIG9mIHBhcnRuZXJzJyBnZW9ncmFwaGljIGZvb3RwcmludHMgdG8gcmVhY2ggdGhlIHJlbWFpbmluZyAyMTMgdG93bnNoaXBzIHdoaWNoIGhhdmUgeWV0IHRvIGJlbmVmaXQgZnJvbSBhbnkgRlNDIGFjdGl2aXRpZXMuIFRoZSBlZmZlY3RzIG9mIHRoZSBjdXJyZW50IGNyaXNpcyBpbiBNeWFubWFyIGhhdmUgbm90IGJlZW4gZGV0ZXJtaW5lZCBieSBhbiBlcGljZW50cmUgb3IgYSBzdG9ybXBhdGggYW5kIHRoZXJlIGlzIG5vIHByb2dyYW1tYXRpYyByYXRpb25hbGUgZm9yIHRoZSByZXNwb25zZSB0byBiZSBzbyB1bmV2ZW4uIFRoaXMgYWR2b2NhY3kgc2hvdWxkIGJlIHRhcmdldHRlZCBhdCB0aGUgSUNDRywgQ2x1c3RlciBwYXJ0bmVycywgb3RoZXIgQ2x1c3RlcnMgYW5kIGF0IGRvbm9ycy4gDQoNCjUuIENvbGxlY3QgNVcgZGF0YSBmcm9tIG90aGVyIGNsdXN0ZXJzIHNvIHRoYXQgbXVsdGktc2VjdG9yIGNvdmVyYWdlIG1heSBiZSByZXZpZXdlZC4gQ2xlYW4gYW5kIHByb2Nlc3MgY29uZmxpY3QgZGF0YSBzbyB0aGF0IGl0IG1heSBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggcGFydG5lcnMnIGNvdmVyYWdlLiANCg0KNi4gV29yayB3aXRoIHBhcnRuZXJzIHRvIGRldGVybWluZSB0aGVpciBjdXJyZW50IGNhcGFjaXRpZXMgdG8gc3VibWl0IGFnZSBhbmQgc2V4LWRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YS4gRGV2ZWxvcCBhIHdvcmtwbGFuIHRvIGVuc3VyZSB0aGF0IHRoZXkgY2FuIG1lZXQgcmVwb3J0aW5nIHJlcXVpcmVtZW50cy4gDQoNCjcuIFNvbGljaXQgbW9uaXRvcmluZyByZXBvcnRzIGZyb20gcGFydG5lcnMgYW5kIGV4cGxvcmUgdGhlIHBvc3NpYmlsaXR5IG9mIGpvaW50IG1vbml0b3JpbmcuIA0KDQo4LiBSZXZpc2UgdGhlIDVXIHRlbXBsYXRlIC0tIGluIGNvbnN1bHRhdGlvbiB3aXRoIHBhcnRuZXJzIC0tIGluIG9yZGVyIHRvIGFkZHJlc3MgdGhlIGRhdGEgY29sbGVjdGlvbiBpc3N1ZXMgaWRlbnRpZmllZC4gDQoNCjxicj48YnI+DQoNCiMjIDYuIFJlZmVyZW5jZSB0YWJsZSAtLSB0b3duc2hpcC1sZXZlbA0KDQpgYGB7ciBkYXRhdGFibGUtdG93bnNoaXBzLXJlZmVyZW5jZX0NCiMgYWRkIGluIHRhcmdldA0KcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgYWRtaW4zX3Bjb2RlLCB0b3RhbF9wb3AsIFBJTl8yMDIyID0gcGluXzIwMjIsIElEUHMgPSBpZHBzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9wb3AgPSByb3VuZCh0b3RhbF9wb3AsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhY3Rpdml0eSwgcGFydG5lcnMgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMsIGJlbmVmaWNpYXJpZXMgPSB1X2JlbiwgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChwYXJ0bmVycyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSBzdW0oYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbikpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmVwbGFjZV9uYShsaXN0KHBhcnRuZXJzID0gMCwgYmVuZWZpY2lhcmllcyA9IDAsIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gMCwgbG9jYXRpb25zID0gMCkpICU+JSANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlLCAuYWZ0ZXIgPSBJRFBzKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gInRvcCIsIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICAgICAgICAgcGFzdGUwKCIkKHRoaXMuYXBpKCkudGFibGUoKS5jb250YWluZXIoKSkuY3NzKHsnZm9udC1zaXplJzogJyIsICI4LjVwdCIsICInfSk7IiksDQogICAgICAgICAgIn0iKQ0KICAgICAgICkgDQogICAgICkgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMgNy4gUmVmZXJlbmNlIG1hcCAtLSB0b3duc2hpcC1sZXZlbA0KDQpgYGB7ciByZWZlcmVuY2UtbWFwLWdncGxvdGx5LCBmaWcuaGVpZ2h0PTEwfQ0KDQojIEkgdGhpbmsgeW91IG5lZWQgdG8gY29hbGVzY2UgdGhlIHN0YXRlcyBhbmQgdG93bnNoaXBzIHdpdGggcGNvZGUzX3NoYXBlIG9yIHN0YXJ0IHdpdGggcGNvZGUzX3NoYXBlDQp0c3BfbWFwIDwtIHBjb2RlM19zaGFwZSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUsIHRvdGFsX3BvcCwgaWRwcywgcGluXzIwMjIpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwNCiAgICAgICAgICBhZXMoZmlsbCA9IHBpbl8yMDIyLA0KICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJTiAyMDIyOiAiLCBwaW5fMjAyMiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnIGNvdW50OiAiLCBwYXJ0bmVycywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0IGNvdW50OiAiLCBhY3Rpdml0aWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBiZW5lZmljaWFyaWVzKSkpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gInR1cmJvIiwgdHJhbnMgPSAibG9nMTAiKSArIA0KICBsYWJzKGZpbGwgPSAiUElOIDIwMjIiLA0KICAgICAgIHRpdGxlID0gIk1hcCBvZiB0b3duc2hpcHMgYnkgMjAyMiBQSU4iKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgDQoNCmdncGxvdGx5KHRzcF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JQ0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBwbG90bHk6OnN0eWxlKGhvdmVyb24gPSAiZmlsbCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJNYXAgb2YgdG93bnNoaXBzIGJ5IDIwMjIgUElOIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgY2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0IGFuZCB6b29tIiwiPC9zdXA+IikpKQ0KYGBgDQoNCg0KDQo=